"Невозможно переключиться на старый режим" - Node.JS ошибка модуля apn в функции tls.connect

Я пытаюсь внедрить модуль Node.JS apn для подключения к APNS (службе уведомления Apple Push) для push-уведомления iPhone-устройств с сервера Node (с помощью ExpressJS), размещенного на экземпляре Amazon EC2 с Ubuntu 12.04. Я получаю эту ошибку:

"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 для push-уведомления. Однако, когда я делаю то же самое в функции, написанной в файле, и выполняю этот файл, тогда он работает отлично. Пожалуйста помоги. Как мне решить проблему?

Ответ 1

Обновить. Поведение, описанное ниже, возможно, изменилось, поскольку этот ответ был первоначально написан; с 0.12.3, docs позволяют предположить, что теперь вы можете переключаться между приостановленным (новым) и текущим (старым) режимом, и эти потоки начинаются с паузы режим.
Кроме того, "старый" ошибочно предлагает устаревший способ делать что-то, но в то время как поток идет первым, оба поддерживаются и имеют свои возможности.


У меня нет конкретного ответа, но общее объяснение:

Короче: старый код, который вызывает .resume() или .pause() на читаемых потоках, может разбиться на node 0.10 и выше.

Долгое время: Вы видите эту ошибку на node 0.10 или выше, когда прочитанный поток был инициализирован для использования нового, приостановленного режима (на основе события readable), и попытка позже переключитесь на старый, текущий режим (на основе события data), который неявно пытается, когда вы вызываете .resume() или .pause() - см. документы.

Настройка события readable может быть даже не связана напрямую. Например, кажется, что использование метода .pipe() теперь неявно переключается на новый, приостановленный режим, поэтому последующий вызов .resume() вызовет эту ошибку.

Ответ 2

Не уверен, что это правильный способ устранить проблему, но это сработало для меня. (Вам нужно будет brew)

  • brew uninstall node
  • brew install nvm
  • скопируйте это в конфигурацию вашей оболочки (в моем случае .zshrc)

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

  1. nvm install iojs