无法将Sails.js应用置于生产环境中

6

我正在尝试使用Sails.js将我的应用程序投入生产,但无法通过grunt任务。这是我收到的错误信息:

error: Error: The hook `grunt` is taking too long to load.
Make sure it is triggering its `initialize()` callback, or else set 
`sails.config.grunt._hookTimeout to a higher value (currently 20000)
at tooLong [as _onTimeout] 
   (/usr/local/lib/node_modules/sails/lib/app/private/loadHooks.js:92:21)
   at Timer.listOnTimeout (timers.js:110:15)

我已经显著增加了sails.config.grunt._hookTimeout,但是进程仍未完成。无论在生产环境还是开发环境中运行sails debug,输出如下:

Grunt :: Error: listen EADDRINUSE
   at exports._errnoException (util.js:746:11)
   at Agent.Server._listen2 (net.js:1156:14)
   at listen (net.js:1182:10)
   at Agent.Server.listen (net.js:1267:5)
   at Object.start (_debugger_agent.js:20:9)
   at startup (node.js:86:9)
   at node.js:814:3

我发现在开发模式下一切正常,但在生产环境中就不是这样。包含的文件相当大,例如angular、moment和其他模块。以下是jsFilesToInject的内容:

var jsFilesToInject = [

 // Load sails.io before everything else
 'js/dependencies/sails.io.js',

 'js/dependencies/angular.min.js',
 'js/dependencies/moment.min.js',
 'js/dependencies/angular-ui-router.min.js',
 'js/dependencies/angular-sails.min.js',
 'js/dependencies/angular-moment.min.js',
 'js/dependencies/angular-animate.min.js',
 'js/dependencies/angular-aria.min.js',
 'js/dependencies/angular-material.min.js',

 // All of the rest of your client-side js files
 // will be injected here in no particular order.
 'js/**/*.js'

];

我不确定还有什么原因会导致这个问题,你有什么建议吗?我在使用Sails版本0.11.0


你在生产中使用哪个端口?如果是80端口,请查看是否已经有其他服务在使用它(如nginx、apache等),并将其关闭。另外,值得尝试以root身份启动Sails,以确定是否存在权限相关的问题。 - galactocalypse
我正在以root身份运行,它在SSL的443端口上。虽然在80端口上无法工作。没有安装Apache或Nginx。 - Michael Wilson
尝试单独运行grunt uglify:dist。 - joncodo
尝试在端口1337上运行它,可能您已经在使用默认端口。 - David Leyva Siqueiros
2个回答

7

我曾遇到同样的问题,原因是超时时间不够长。我需要在我的config/local.js文件中添加以下代码:

module.exports = {
    hookTimeout: 120000
};

回到这个问题,一年之后,我会说你应该运行grunt或者grunt buildProd并加上--verbose标志来查看为什么运行时间这么长。也可能是其他东西已经在那个端口上运行了。您可以通过sails lift --port=1234 来测试另一个端口。 - joncodo

1

我刚刚在github上发布了同样的问题,然后查看了源代码。因此,我通过grunt hook仔细阅读了内容以了解发生了什么。结果发现,在默认模式下,grunt hook会在grunt启动后立即触发回调函数,但对于prod模式,则仅在grunt完成所有任务后触发。

在源代码中有以下注释:

cb-可选项,在Grunt任务已启动(非生产环境)或已完成(生产环境)时触发

因此,如果有任何正在监视的内容(例如在browserify中使用watch),则在prod中,grunt任务将永远不会退出,因此grunt hook将始终超时。但即使没有任何监视,启动grunt任务所需的时间也比完成所有任务所需的时间长得多,这就解释了为什么在非生产模式下我们看不到问题。

由于修改原始的grunt hook并不是最好的选择(它位于node_modules中),因此最好的方法确实是增加(可能极大地增加)_hookTimeout选项,并确保grunt任务退出(为此可以使用grunt prod单独运行)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接