“现在不能切换到旧模式” – ts..connect函数中的Node.JS apn模块错误

我试图实现Node.JS apn模块连接到APNS(Apple推送通知服务),以便从运行Ubuntu 12.04的Amazon EC2实例上托pipe的节点服务器(使用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模块function推送通知。 但是,当我在一个写在一个文件中的函数做同样的事情并执行该文件,那么它工作得很好。 请帮忙。 我应该如何解决这个问题呢?

更新 :下面描述的行为可能已经改变,因为这个答案是最初写的; 从0.12.3 , 文档build议您现在可以在暂停 (新)和stream (旧)模式之间来回切换,并且该stream以暂停模式启动。
另外,“老”错误地提出了一个贬低的做事方式,但stream动的方式来之前,都支持和使用。


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

简而言之: 在可读stream上调用.resume().pause()旧代码可能会在节点0.10和更高节点上破坏。

它的长度是:当可读stream已经被初始化为使用新的暂停模式 (基于readable事件)并且稍后尝试切换到旧的stream动模式时,在节点0.10或更高处看到该错误基于data事件),当您调用.resume().pause()时隐式尝试 – 请参阅文档 。

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

不知道这是否是解决问题的“正确”方法,但对我有效。 (你需要酿造 )

  1. brew uninstall node
  2. brew install nvm
  3. 复制到你的shellconfiguration(在我的情况下.zshrc)

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

  1. nvm install iojs