Sails.js 帆未经处理就下降。退出-功能或错误?

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.js应用程序是在PM2下运行的,我希望PM2能够重启应用程序,在崩溃的情况下会重启。问题是,当sails无法加载钩子时,例如,如果启动时DB不可用,则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代码从来没有运行过。我遇到了完全相同的问题,这很有魅力!