【问题标题】:Unable to put Sails.js app in production无法将 Sails.js 应用程序投入生产
【发布时间】:2015-10-18 15:04:18
【问题描述】:

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

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 身份提升风帆,以查看它是否是与权限相关的问题。
  • 我以 root 身份运行,它在 SSL 端口 443 上运行。虽然它无论如何都不能在 80 上工作。没有安装 apache 或 nginx。
  • 尝试自己运行 grunt uglify:dist
  • 尝试在 1337 端口运行它,可能你已经在使用默认端口

标签: node.js gruntjs sails.js


【解决方案1】:

我也遇到了同样的问题,只是超时时间不够大,我不得不把它放在我的 config/local.js 文件中:

module.exports = {
    hookTimeout: 120000
};

【讨论】:

  • 一年后回到这个问题,我会说你应该运行带有 --verbose 标志的 grunt 或 grunt buildProd 来看看为什么它需要这么长时间才能运行。也可能是其他东西已经在该端口上运行。你可以做一个风帆升降机 --port=1234 在另一个端口上测试
【解决方案2】:

我刚刚在 github 上发布了同样的问题,然后查看了源代码。所以我通读了 grunt 钩子以了解发生了什么。事实证明,在default 模式下,grunt 钩子在 grunt 启动后立即触发回调,但对于prod 模式,它仅在 grunt 完成所有任务时触发。

源码中有如下注释:

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

因此,如果在prod 中有任何观察(例如在 browserify 中使用 watch),grunt 任务将永远不会退出,因此 grunt 钩子将始终超时。但是即使什么都没有看,启动 grunt 任务比完成所有任务花费的时间要长得多,这解释了为什么我们在不处于生产模式时看不到问题。 由于修改原始 grunt 钩子不是最好的主意(它位于 node_modules),最好确实增加(可能显着)_hookTimeout 选项并确保 grunt 任务退出(为此它可以单独运行grunt prod)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多