我正在Amazon Elastic Beanstalk上运行Express. js应用程序,我的环境已成功创建,但当我通过Amazon创建的URL进入我的环境时,我收到了502 Bad Gateway nginx/1.6.2
错误。虽然我阅读了StackOverflow上的其他资源,建议我将主文件从server.js
重命名为main.js
并在bin/www
文件夹中设置port
,但我觉得这不是我的应用程序的解决方案。我运行了node server.js
,这是我认为Elastic Beanstalk运行的命令,但它不起作用,(错误消息):
node server.js
events.js:72
throw er; // Unhandled 'error' event
^
Error: failed to connect to [undefined:27017]
因为我在. env
文件中设置了ENV变量,所以我运行服务器的唯一方法是使用Foreman。这让我认为502错误是Elastic Beanstalk无法理解变量的结果,从而导致服务器失败。有人能确认我走在正确的道路上吗?还是这个问题真的是因为我的主文件名为server.js
,而不是在bin/www
文件夹中?
以下是我的server.js
文件中的代码:
//Load express
var express = require('express');
var app = express();
var router = express.Router(); // get an instance of the router
var bodyParser = require('body-parser'); // configure app to use bodyParser()
var mongoose = require('mongoose');
var passport = require('passport');
var flash = require('connect-flash');
var morgan = require('morgan');
var cookieParser = require('cookie-parser');
var session = require('express-session');
var aws = require('aws-sdk');
app.use(bodyParser.urlencoded({ extended: true})); // get data from a POST method
app.use(bodyParser.json());
app.use(morgan('dev'));
app.use(cookieParser());
var port = process.env.PORT || 8080; // set the port
var DB_CONFIG = process.env.DB_CONFIGURATION;
var AWS_ACCESS_KEY = process.env.AWS_ACCESS_KEY;
var AWS_SECRET_KEY = process.env.AWS_SECRET_KEY;
var S3_BUCKET = process.env.S3_BUCKET;
var blogDB = require('./config/blogDB.js');
mongoose.connect(blogDB.url);
require('./config/passport.js')(passport);
app.set('view engine', 'ejs'); // set ejs as the view engine
app.use(express.static(__dirname + '/public')); // set the public directory
app.use(session({ secret: 'thisisatest' }));
app.use(passport.initialize());
app.use(passport.session());
app.use(flash());
var routes = require('./app/routes');
app.use(routes); // use routes.js
app.listen(port);
console.log('magic is happening on port' + port);
和我的包裹文件:
{
"name": "test",
"main": "server.js",
"dependencies": {
"body-parser": "1.6.5",
"ejs": "^1.0.0",
"express": "^4.6.1",
"express-paginate": "0.0.2",
"mongoose": "~3.6.15",
"mongoose-paginate": "^3.1.0",
"serve-favicon": "*",
"passport" : "~0.1.17",
"passport-local" : "~0.1.6",
"connect-flash" : "~0.1.1",
"bcrypt-nodejs" : "latest",
"morgan": "~1.0.0",
"cookie-parser": "~1.0.0",
"method-override": "~1.0.0",
"express-session": "~1.0.0",
"aws-sdk": "*"
}
}
我今晚也有同样的问题。事实证明,节点应用程序尚未启动,尽管门户声称默认情况下它将运行npm-start
。
以下是我所做的来修复它:
option_settings:
- namespace: aws:elasticbeanstalk:container:nodejs
option_name: NodeCommand
value: "npm start"
完整的说明可在此处获得: https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/create_deploy_nodejs_express.html
>
将"脚本":{"start":"node app. js"}
添加到您的pack.json
。如果您的主js文件不是app.js
,请不要忘记重命名它!:)
重要提示:即使将env-var添加为port
,也必须使用port
(大写)。这就是解决我问题的原因。我尝试使用process.env.port
,但没有成功。请改用process.env.PORT
。
const port = process.env.PORT || 3000;
app.listen(port, () => {
console.log("Server is listening on: ", port);
});
从EB应用仪表板,转到配置-
即使AWS显示“启动Node. js应用程序的命令。如果指定了一个空字符串,则使用app.js,然后使用server.js,然后按该顺序使用“npm start”,除非您指定,否则它看起来不会运行。