Анализ проблем co и pm2, возникающих при обновлении версии Node.js

Node.js задняя часть внешний интерфейс JavaScript Апплет WeChat Promise PM2

задний план

Проекты Nodejs 4.x необходимо обновить до 6.9.5 (последняя стабильная версия на тот момент) для повышения производительности и надежности.

Co используется в бизнесе, а процесс управляется pm2.

обновить версию nodejs

Убедитесь, что скрипт сборки может установить nodejs 6.9.5 с помощью nvm, локальный запуск в основном в порядке.

Начните с вопроса co

UnhandledPromiseRejectionWarning: Cannot read property 'done' of undefined

Приведенная выше информация о тревоге генерируется, когда служба запущена, а служба недоступна.Посредством поиска обнаружено, что есть обещание, которое окончательно отклонено, но подвоха нет.Я знаю, что прямая причина в этом, но это бесполезно Где я могу найти код этой функции .

Рассмотрите возможность отладки точки останова

process.on('unhandledRejection', function(reason, p){
  console.log('=======================');
  console.log(reason);
  console.log(p);
});

Приведенный выше код добавляется в службу для запуска, запускается локальная отладка и все оказывается в норме -_-b

Не воспроизводит проблему, просмотр всей проблемы, визуальный осмотр может бытьтестовая средаВопрос, давайте сначала посмотрим на версию nodejs

console.log(process.versions)

Версия nodejs по-прежнему является старой версией.

проблема с пм2

Единственный способ определить версию nodejs — запустить процесс, и проблема падает на pm2.Проверьте конфигурацию процесса pm2.

> pm2 show myapp_name
│ interpreter       │ node
│ interpreter args  │ --harmony
....
│ exec mode         │ cluster_mode
│ node.js version   │ 4.4.2

Конечно, проблема с версией, учитывая модель управления процессами pm2, после запуска процесса-демона рабочие процессы запускаются один за другим, иexec mode: cluster_modeОзначает, что он использует кластерный модуль nodejs для запуска дочернего процесса.

Далее дочерний процесс запуска кластера запускается с помощью fork(), причем версии дочернего процесса и родительского процесса должны совпадать, по этой причине высока вероятность.

Простой способ перезапустить процесс демона — этоpm2 killПосле убийства демона и всех рабочих процессов перезапуститеpm2 startВывод после некоторых метаний:

  1. обновления процесса демона, за исключениемpm2 kill && pm2 pingПомимо перезапуска демона, вы также можетеpm2 updateОн также будет использовать текущую версию pm2.
  2. Если вы хотите, чтобы приложение вступило в силу, рекомендуется снова добавить приложение,pm2 delete app.json && pm2 start app.json

тестовая средаПосле перезапуска процесса демона pm2 запуск по-прежнему является аварийным сигналом, описанным в предыдущей статье, ноnode.js versionРезультат соответствует ожиданиям.

Хоть это и не решило проблему, необходимо обновить версию Продолжайте читать и собирать подсказки

Вернемся к вопросу о ко

Теперь версия nodejs такая же, но сигнализация тестовой среды, локальная не воспроизводится, это все еще может быть проблема среды, продолжайте смотреть на конфигурацию процесса, нашелinterpreter args: --harmony

Это переключатель, добавленный старой версией nodejs для совместимости с новыми функциями.Учитывая, что стек ошибок исходит от co, проверьте документацию co

co platform compatibility

Логически v4 +, тогда вы не добавляете этот коммутатор, пока не волнует, зачем добавлять этот коммутатор, то текущее разница в этом месте можно найти вместе с локальным первым взглядом на переключатель работы

результатВоспроизвести тот же будильник, явления локальной и тестовой среды согласованы

Далее это легко сделать, удалите эту конфигурацию в app.json,pm2 delete app.json && pm2 start app.jsonПерезапустите приложение, проблема решена.

Суммировать

  1. pm2 cluster_mode должен синхронно обновлять процесс демона при обновлении nodejs
  2. Конфигурацию рабочего процесса также необходимо обновить вручную.
  3. nodejs не гарантирует совместимость с некоторыми экспериментальными коммутаторами.

Реальные возникающие экологические проблемы могут быть смешаны с несколькими ключевыми причинами, и все они должны быть устранены, чтобы работать должным образом.

Неправильно - норма, верно - ряд случайных сочетаний

Оставшиеся вопросы: Как к этому добавил --harmony?

Изучите кластер студентов, которые должны знать разветвление (только один параметр, переменные среды, затем какое-то странное место) а.

Одна из возможностей состоит в том, что демон pm2 добавляется при запуске, но это не логично, демон может управлять несколькими проектами, некоторые из них кластерные, некоторые нет.

Просто гадать явно нехорошо, посмотрите исходный код

God.nodeApp = function nodeApp(env_copy, cb){
  var clu = null;
 
  console.log('Starting execution sequence in -cluster mode- for app name:%s id:%s',
              env_copy.name,
              env_copy.pm_id);
 
  if (env_copy.node_args && Array.isArray(env_copy.node_args)) {
    // 注意下面这行
    cluster.settings.execArgv = env_copy.node_args;
  }
 
  env_copy._pm2_version = pkg.version;
 
  try {
    // node.js cluster clients can not receive deep-level objects or arrays in the forked process, e.g.:
    // { "args": ["foo", "bar"], "env": { "foo1": "bar1" }} will be parsed to
    // { "args": "foo, bar", "env": "[object Object]"}
    // So we passing a stringified JSON here.
    clu = cluster.fork({pm2_env: JSON.stringify(env_copy)});
  } catch(e) {
    God.logAndGenerateError(e);
    return cb(e);
  }

Перечитал документацию по кластеру и обнаружил, что cluster.settings существует.

cluster.settings


Всем привет, меня зовут Цао Юй, я технический эксперт Maoyan Entertainment. В основном я отвечаю за внешний интерфейс Maoyan Entertainment по выбору мест в кинотеатрах и транзакциям. В дополнение к различным веб-страницам, которые вы можете видеть, Есть также небольшие программы и стороны цепочки поставок.В то же время, я несу ответственность за Maoyan.Внутренняя передняя инфраструктура, работа, связанная с обеспечением качества.

Мини-программа Maoyan Movie Mini развивалась с нуля до первого в категории продажи билетов. Основное внимание уделяется онлайну. На этот раз я делюсь онлайн и офлайн-мероприятием. От разработки до запуска я столкнулся с некоторыми интересными вещами, за исключением мини-программы.Углубленное применение технологии также включает в себя мышление на уровне эксплуатации продукта.

В эту субботу (21 октября) я буду гостем в живой комнате Nuggets Bilibili, чтобы дать вам прямую трансляцию «Руководство по кодам: начните со сканирования кодов под линией кошачьего глаза для покупки 1 очка». Во время прямой трансляции мы также будем раздавать призы, такие как технические книги, большие нестандартные коврики для мыши и т. д. Приглашаем всех пообщаться с нами в субботу днем.