我的sails.js应用程序在PM2下运行,我希望PM2能够重启应用程序,它会在崩溃时执行。问题是,当sails无法加载钩子时,例如,如果DB在启动时不可用,则优雅的sails.lower()
由sails内部调用,但实际的节点进程不会退出(no {{通过核心风帆代码降低后调用1}}。这导致PM2不知道风帆已关闭,因此不会再次启动它。
这一切都发生在应用程序的初始引导中,并且在我的任何代码被调用之前,所以我无法控制它。
有人对我如何解决这个问题有任何建议吗?
我认为我可以编写一个自定义核心挂钩,可以挂钩process.exit()
并在接收到该事件时调用sail.on('lowered', fn)
。想法?
非常感谢。
答案 0 :(得分:2)
我最终写了一个钩子来完成我需要的东西。钩子监听sails.on('lower')
(不像文档说的那样“降低”!!)并等待可配置的时间然后用可配置的退出代码调用process.exit()
。
如果其他人需要它,请创建以下api/hooks/exitOnLower.js
文件...
module.exports = function (sails) {
return {
defaults: {
__configKey__: {
name : 'exitOnlower',
wait : 10000,
active: true,
// exitCode : 2
}
},
initialize: function (cb) {
var active = sails.config[this.configKey].active;
var timeout = sails.config[this.configKey].wait;
var exitCode = sails.config[this.configKey].exitCode;
if (!active) {
return cb();
}
sails.on('lower', function () {
sails.log.verbose("[hook:killOnLower] Sails lower detected, exiting in %sms...", timeout);
setTimeout(function () {
sails.log.warn("[hook:killOnLower] exiting app");
process.exit(exitCode ? exitCode : null);
}, timeout)
});
return cb();
}
};
};
答案 1 :(得分:1)
Sails在降低时不会调用compose
,因为Sails应用程序可能已经以编程方式(通过process.exit
或sails.lift()
)启动,并且以这种方式退出进程将退出调用的脚本也是如此。
事实是,当事件循环中没有任何内容时,Node脚本应该自动退出。您可以通过使用sails.lower()
创建新的Sails应用程序并在该目录中创建测试脚本来自行验证:
sails new
在命令行上执行/* testscript.js */
var Sails = require('sails');
Sails.load({hooks: {grunt: false, views: false}}, function(err) {
console.log('lifted sails!');
Sails.lower(function(err) {
console.log('lowered sails!');
});
});
,您将看到两个日志,然后再次显示命令提示符。
所有这一切都是为了证明如果你的应用不降低,那是因为有些东西让它不这样做。最可能的事情是数据库适配器。一些适配器(如Postgres)保持TCP连接一段时间。如果等待30秒左右,您可能会看到该过程自动退出。如果30秒太长而无法等待,并且如果您不以编程方式调用Sails,您当然可以自己致电node testscript.js
。您可以等待process.exit
事件,然后给Sails一些时间来清理:
lower
把它放在你的sails.on('lower', function() {
// Give Sails five seconds to shut down before pulling the plug.
setTimeout(
function() { process.exit(1); },
5000
);
});
中,你应该好好去。
如果您想了解实际上暂停了您的流程并阻止其立即退出,请尝试使用优秀的why-is-node-running模块。
注意:在发布此消息时,
config/bootstrap.js
事件在Sailsjs.com上被错误地记录为lower
。这将尽快修复。