问题
I have a very basic sails app up and running locally. When I deploy to Heroku, I cannot get a response from the app and then eventually get "Application Error". I sometimes receive "No data received".
heroku logs
2015-08-30T22:06:50.949475+00:00 heroku[api]: Release v22 created by me
2015-08-30T22:08:57.324207+00:00 heroku[router]: at=error code=H20 desc="App boo
t timeout" method=GET path="/" host=www.ninjalist.io request_id=8e21f6eb-1a59-4e
31-9c40-00aab002d0f1 fwd="118.61.238.166" dyno= connect= service= status=503 bytes=
2015-08-30T22:08:52.058851+00:00 heroku[web.1]: State changed from starting to down
2015-08-30T22:11:55.735176+00:00 heroku[router]: at=error code=H10 desc="App cra
shed" method=GET path="/" host=ninjalist.herokuapp.com request_id=314047d1-97d8-
40ea-8596-4b21978eb581 fwd="108.61.228.166" dyno= connect= service= status=503 b
heroku logs --source app
2015-08-30T21:40:42.149449+00:00 app[web.1]: > firstApp@0.0.1 start /app
2015-08-30T21:40:42.149452+00:00 app[web.1]: > sails lift --prod
2015-08-30T21:40:42.149453+00:00 app[web.1]:
2015-08-30T21:40:42.149430+00:00 app[web.1]:
2015-08-30T21:40:42.873435+00:00 app[web.1]: ←[90mStarting app...←[39m
2015-08-30T21:40:42.871270+00:00 app[web.1]:
2015-08-30T21:40:42.873742+00:00 app[web.1]:
2015-08-30T21:40:44.441658+00:00 app[web.1]: Warning: connect.session() MemorySt
ore is not
2015-08-30T21:40:44.441664+00:00 app[web.1]: designed for a production environme
nt, as it will leak
2015-08-30T21:40:44.441666+00:00 app[web.1]: memory, and will not scale past a s
ingle process.
2015-08-30T21:41:04.326177+00:00 app[web.1]: Error: The hook `grunt` is taking t
oo long to load.
2015-08-30T21:41:04.326187+00:00 app[web.1]: at Timer.listOnTimeout (timers.
js:119:15)
2015-08-30T21:41:04.326183+00:00 app[web.1]: Make sure it is triggering its `ini
tialize()` callback, or else set `sails.config.grunt._hookTimeout to a higher va
lue (currently 20000)
2015-08-30T21:41:04.326185+00:00 app[web.1]: at tooLong [as _onTimeout] (/ap
p/node_modules/sails/lib/app/private/loadHooks.js:92:21)
2015-08-30T21:41:04.587989+00:00 app[web.1]:
2015-08-30T21:41:04.641592+00:00 app[web.1]: npm ERR! argv "/app/.heroku/node/bi
n/node" "/app/.heroku/node/bin/npm" "start"
2015-08-30T21:41:04.641839+00:00 app[web.1]: npm ERR! node v0.12.7
2015-08-30T21:41:04.668957+00:00 app[web.1]: npm ERR! npm v2.11.3
2015-08-30T21:41:04.669159+00:00 app[web.1]: npm ERR! code ELIFECYCLE
2015-08-30T21:41:04.669368+00:00 app[web.1]: npm ERR! firstApp@0.0.1 start: `sai
ls lift --prod`
2015-08-30T21:41:04.669504+00:00 app[web.1]: npm ERR! Exit status 1
2015-08-30T21:41:04.669672+00:00 app[web.1]: npm ERR!
2015-08-30T21:41:04.669827+00:00 app[web.1]: npm ERR! Failed at the firstApp@0.0
.1 start script 'sails lift --prod'.
2015-08-30T21:41:04.670024+00:00 app[web.1]: npm ERR! This is most likely a prob
lem with the firstApp package,
2015-08-30T21:41:04.670133+00:00 app[web.1]: npm ERR! not with npm itself.
2015-08-30T21:41:04.670267+00:00 app[web.1]: npm ERR! Tell the author that this
fails on your system:
2015-08-30T21:41:04.670427+00:00 app[web.1]: npm ERR! sails lift --prod
2015-08-30T21:41:04.675558+00:00 app[web.1]: npm ERR! You can get their info via
:
2015-08-30T21:41:04.676317+00:00 app[web.1]: npm ERR! npm owner ls firstApp
2015-08-30T21:41:04.697584+00:00 app[web.1]:
2015-08-30T21:41:04.676320+00:00 app[web.1]: npm ERR! There is likely additional
logging output above.
2015-08-30T21:41:04.701882+00:00 app[web.1]: npm ERR! /app/npm-debug.log
2015-08-30T21:41:04.640986+00:00 app[web.1]: npm ERR! Linux 3.13.0-61-
Procfile:
web: npm start
package.json / scripts:
"scripts": {
"debug": "node debug app.js",
"start": "sails lift --prod"
}
config/env/production:
module.exports = {
models: {
connection: 'mongoDbProd'
},
port: 80,
log: {
level: "silent"
}
};
Any direction is appreciated!
回答1:
You can also use a specialized buildpack for Heroku that runs the Grunt tasks on deployment, and then turn off Grunt in Sails for the production environment. It's a bit more work, but it can become necessary because Heroku has its own timeout which can be tripped by Grunt taking too long to crunch your assets.
We've had success with heroku-buildpack-nodejs-grunt. You can follow the instructions to install it on your Heroku app, then copy the task definition in your tasks/register/prod.js
to include heroku:production
task, e.g.:
module.exports = function (grunt) {
grunt.registerTask('prod', [
'compileAssets',
'concat',
'uglify',
'cssmin',
'sails-linker:prodJs',
'sails-linker:prodStyles',
'sails-linker:devTpl',
'sails-linker:prodJsJade',
'sails-linker:prodStylesJade',
'sails-linker:devTplJade'
]);
grunt.registerTask('heroku:production', [
'compileAssets',
'concat',
'uglify',
'cssmin',
'sails-linker:prodJs',
'sails-linker:prodStyles',
'sails-linker:devTpl',
'sails-linker:prodJsJade',
'sails-linker:prodStylesJade',
'sails-linker:devTplJade'
]);
};
Then finally in your app.js
file, replace
sails.lift(rc('sails'));
with:
var config = rc('sails');
if (process.env.NODE_ENV === 'production') {
config.hooks = config.hooks || {};
config.hooks.grunt = false;
}
// Start server
sails.lift(config);
回答2:
From: https://github.com/balderdashy/sails/issues/2691
Creating a file config/locals.js with the following resolved the issue for me:
module.exports = {
hookTimeout: 30000, // 30 seconds
}
回答3:
In addition to setting hookTimeout, make sure you have
migrate: 'alter'
set in config/models.js
回答4:
Adding the official Heroku Node.js buildpack worked for me: https://github.com/heroku/heroku-buildpack-nodejs
In Heroku CLI:
heroku buildpacks:add https://github.com/heroku/heroku-buildpack-nodejs.git
Then:
git push heroku master
Everything should build successfully, and your app should run just fine in Heroku.
来源:https://stackoverflow.com/questions/32301779/heroku-and-sails-app-crashes-and-timeouts