задний план
Проекты 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
Вывод после некоторых метаний:
- обновления процесса демона, за исключением
pm2 kill && pm2 ping
Помимо перезапуска демона, вы также можетеpm2 update
Он также будет использовать текущую версию pm2. - Если вы хотите, чтобы приложение вступило в силу, рекомендуется снова добавить приложение,
pm2 delete app.json && pm2 start app.json
тестовая средаПосле перезапуска процесса демона pm2 запуск по-прежнему является аварийным сигналом, описанным в предыдущей статье, ноnode.js version
Результат соответствует ожиданиям.
Хоть это и не решило проблему, необходимо обновить версию Продолжайте читать и собирать подсказки
Вернемся к вопросу о ко
Теперь версия nodejs такая же, но сигнализация тестовой среды, локальная не воспроизводится, это все еще может быть проблема среды, продолжайте смотреть на конфигурацию процесса, нашелinterpreter args: --harmony
Это переключатель, добавленный старой версией nodejs для совместимости с новыми функциями.Учитывая, что стек ошибок исходит от co, проверьте документацию co
Логически v4 +, тогда вы не добавляете этот коммутатор, пока не волнует, зачем добавлять этот коммутатор, то текущее разница в этом месте можно найти вместе с локальным первым взглядом на переключатель работы
результатВоспроизвести тот же будильник, явления локальной и тестовой среды согласованы
Далее это легко сделать, удалите эту конфигурацию в app.json,pm2 delete app.json && pm2 start app.json
Перезапустите приложение, проблема решена.
Суммировать
- pm2 cluster_mode должен синхронно обновлять процесс демона при обновлении nodejs
- Конфигурацию рабочего процесса также необходимо обновить вручную.
- 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 существует.
Всем привет, меня зовут Цао Юй, я технический эксперт Maoyan Entertainment. В основном я отвечаю за внешний интерфейс Maoyan Entertainment по выбору мест в кинотеатрах и транзакциям. В дополнение к различным веб-страницам, которые вы можете видеть, Есть также небольшие программы и стороны цепочки поставок.В то же время, я несу ответственность за Maoyan.Внутренняя передняя инфраструктура, работа, связанная с обеспечением качества.
Мини-программа Maoyan Movie Mini развивалась с нуля до первого в категории продажи билетов. Основное внимание уделяется онлайну. На этот раз я делюсь онлайн и офлайн-мероприятием. От разработки до запуска я столкнулся с некоторыми интересными вещами, за исключением мини-программы.Углубленное применение технологии также включает в себя мышление на уровне эксплуатации продукта.
В эту субботу (21 октября) я буду гостем в живой комнате Nuggets Bilibili, чтобы дать вам прямую трансляцию «Руководство по кодам: начните со сканирования кодов под линией кошачьего глаза для покупки 1 очка». Во время прямой трансляции мы также будем раздавать призы, такие как технические книги, большие нестандартные коврики для мыши и т. д. Приглашаем всех пообщаться с нами в субботу днем.