Sails.js 帆未经处理就下降。退出-功能或错误?
我的sails.js应用程序是在PM2下运行的,我希望PM2能够重启应用程序,在崩溃的情况下会重启。问题是,当sails无法加载钩子时,例如,如果启动时DB不可用,则sails会在内部调用优雅的Sails.js 帆未经处理就下降。退出-功能或错误?,sails.js,pm2,sails-mongo,Sails.js,Pm2,Sails Mongo,我的sails.js应用程序是在PM2下运行的,我希望PM2能够重启应用程序,在崩溃的情况下会重启。问题是,当sails无法加载钩子时,例如,如果启动时DB不可用,则sails会在内部调用优雅的sails.lower(),但核心sails代码不会退出实际的节点进程(没有process.exit())。其结果是PM2不知道sails已关闭,因此不会再次启动 这一切都发生在应用程序的初始引导过程中,在调用我的任何代码之前,所以我无法控制它 有人对我如何解决这个问题有什么建议吗 我想我可以编写一个定制
sails.lower()
,但核心sails代码不会退出实际的节点进程(没有process.exit()
)。其结果是PM2不知道sails已关闭,因此不会再次启动
这一切都发生在应用程序的初始引导过程中,在调用我的任何代码之前,所以我无法控制它
有人对我如何解决这个问题有什么建议吗
我想我可以编写一个定制的核心钩子,它可以钩住sail.on('lowered',fn)
并在接收到该事件时调用进程.exit()
。想法
非常感谢。Sails不会调用
进程。当它下降时退出,因为Sails应用程序可能是通过编程方式启动的(通过Sails.lift()
或Sails.lower()
),以这种方式退出进程也会退出调用Sails的脚本
事实上,当事件循环中没有任何内容时,节点脚本应该自动退出。您可以通过使用sailsnew
创建一个新的Sails应用程序,并在该目录中创建一个测试脚本来验证这一点,如:
/* 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!');
});
});
在命令行上执行node testscript.js
,您将看到两个日志,然后再次看到命令提示符
所有这些都是为了证明,如果你的应用程序没有降低,那是因为有什么东西阻止它这么做。最有可能的是数据库适配器。一些适配器(如Postgres)使TCP连接保持活动状态一段时间。如果您等待30秒左右,您可能会看到进程自动退出。如果30秒的等待时间太长,并且您没有以编程方式调用Sails,那么您当然可以自己调用process.exit
。您可以等待lower
事件,然后给帆船一点时间先清理干净:
sails.on('lower', function() {
// Give Sails five seconds to shut down before pulling the plug.
setTimeout(
function() { process.exit(1); },
5000
);
});
把它放到你的config/bootstrap.js
中,你就可以开始了
如果您想知道到底是什么在挂起您的进程并阻止它立即退出,请尝试优秀的模块
注意:在发布此帖子时,lower
事件在Sailsjs.com上被错误地记录为lowered
。这将尽快解决
最后我写了一个钩子来完成我需要的东西。钩子监听的sail.on('lower')
(不是文档中所说的“lowered”),等待一段可配置的时间,然后使用可配置的退出代码调用进程.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();
}
};
};
非常感谢@sgress454的回复,这很有意义。实际上,我写了一个钩子来完成我需要的东西,基本上就是你所建议的,尽管,因为ORM钩子失败了(例如,当DB离线时),我的bootstrap.js代码从来没有运行过。我遇到了完全相同的问题,这很有魅力!