"现在无法切换到旧模式“-tls.connect函数中出现Node.JS apn模块错误

"Cannot switch to old mode now" - Node.JS apn module error in tls.connect function

本文关键字:函数 connect -tls JS 错误 模块 apn Node 模式 quot      更新时间:2023-09-26

我正在尝试实现Node.JS apn模块,以连接到APNS(苹果推送通知服务),从运行Ubuntu 12.04的亚马逊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模块函数来推送通知时。然而,当我在一个写在文件中的函数中做同样的事情并执行该文件时,它就可以正常工作了。请帮忙。我该如何着手解决这个问题?

更新:自从最初编写此答案以来,下面描述的行为可能已经发生了变化;从0.12.3开始,文档建议您现在可以在暂停(新)和流动模式(旧)之间来回切换,并且流以停止的模式开始
此外,"old"错误地暗示了一种不受欢迎的做事方式,但尽管流动模式是第一位的,但两者都受到支持并有各自的用途。


我没有具体的答案,但有一个一般的解释:

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

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

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

不确定这是否是解决问题的"正确"方法,但它对我有效

  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