【问题标题】:"Cannot switch to old mode now" - Node.JS apn module error in tls.connect function“现在无法切换到旧模式”- tls.connect 函数中的 Node.JS apn 模块错误
【发布时间】:2013-08-20 20:17:53
【问题描述】:

我正在尝试实现 Node.JS apn 模块以连接到 APNS(Apple 推送通知服务),以便从运行 Ubuntu 12.04 的 Amazon EC2 实例上托管的节点服务器(使用 ExpressJS)向 iPhone 设备推送通知。我收到此错误:

"Error: Cannot switch to old mode now.",
"    at emitDataEvents (_stream_readable.js:720:11)",
"    at ReadStream.Readable.resume (_stream_readable.js:705:3)",
"    at TLSSocket.<anonymous> (/home/ubuntu/usemebeta/routes/message.js:101:48)",
"    at TLSSocket.g (events.js:186:14)",
"    at TLSSocket.EventEmitter.emit (events.js:97:17)",
"    at TLSSocket.<anonymous> (_tls_wrap.js:579:16)",
"    at TLSSocket.EventEmitter.emit (events.js:97:17)",
"    at TLSSocket._finishInit (_tls_wrap.js:198:8)"

当我调用 apn 模块函数来推送通知时。 但是,当我在文件中编写的函数中执行相同的操作并执行该文件时,它就可以正常工作。请帮忙。我应该如何解决这个问题?

【问题讨论】:

  • 显示相关代码,以便我们重现并纠正错误。
  • 另外你使用的是什么版本的 Node.js?

标签: javascript node.js stream


【解决方案1】:

更新:自最初编写此答案以来,下面描述的行为可能已经改变;从0.12.3 开始,docs 建议您现在可以在 paused(新)和 flowing(旧)模式之间来回切换,并且流开始处于暂停模式。
此外,“旧”错误地暗示了一种已弃用的做事方式,但虽然流动模式首先出现,但两者都受到支持并有其用途。


我没有具体的答案,只是一般的解释:

简而言之:在可读流上调用 .resume().pause() 的旧代码可能会在节点 0.10 及更高版本上中断。

它的长处: 当一个可读流被初始化为使用新的、暂停模式(基于readable事件)和一个稍后尝试切换到旧的、流动模式(基于data事件),当您调用.resume().pause()时会隐式尝试- 见docs

甚至可能不直接涉及设置readable 事件。 例如,现在使用.pipe() 方法似乎会隐式切换到新的暂停模式,因此后续的.resume() 调用会触发此错误。

【讨论】:

    【解决方案2】:

    不确定这是否是解决问题的“正确”方法,但它对我有用。 (你需要有brew

    1. brew uninstall node
    2. brew install nvm
    3. 将其复制到您的 shell 配置中(在我的情况下为 .zshrc)

    export NVM_DIR=~/.nvm source $(brew --prefix nvm)/nvm.sh

    1. nvm install iojs

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-07-16
      • 2021-02-19
      • 2016-06-22
      • 2014-11-28
      • 1970-01-01
      • 2020-11-14
      • 2017-12-22
      相关资源
      最近更新 更多