我有一个正在尝试部署的 Node/Angular 应用程序。它使用两个 Node 服务器:一个主要为应用程序提供服务;另一个用于为应用程序提供服务。另一个是当应用程序请求特定端口时从 API 获取数据,并将该数据存储在本地。
我已经让它在我自己的本地机器上完美运行。但是,当我部署到生产环境(Heroku 或 AWS Elastic Beanstalk)时,我发现第二个脚本无法运行或无法正常启动。最终的结果是,它没有得到我需要的数据。
这是两个脚本;它们都设置为在 package.json 中的“start”下运行:“node main.js & node node-server.js”
main.js(同样,这个似乎可以很好地为应用程序提供服务):
var express = require('express');
var app = express();
app.use(express.static(__dirname + '/app'));
app.listen(process.env.PORT || 3000);
node-server.js(似乎不起作用;应用程序中没有收集或填充任何数据):
var http = require('http');
var port2 = 1234
var fs = require('fs');
//We need a function which handles requests and send response
function handleRequest(req, res) {
request.get({
url: 'http://sample-url.json',
qs: {
url: 'http://sampletool/pb/newsletter/?content=true'
}
}, function (err, result) {
res.end(result.body);
fs.writeFile('app/data.json', result.body, function (err) {
if (err) return console.log(err);
console.log('API data > data.json');
});
});
}
//Create a server
var server = http.createServer(handleRequest);
//Lets start our server
server.listen(port2, function () {
//Callback triggered when server is successfully listening. Hurray!
console.log("Server listening on: http://0.0.0.0:%d", port2);
});
然后,当页面加载时,主 Angular 应用程序会调用此端口 ( http://0.0.0.0:1234 ),以请求新数据。
Elastic Beanstalk 使用的是 nginx,这是我不太熟悉的东西,而且我没有在本地运行它。
在将多个 Node.js 服务器配置为在生产环境中的不同端口上运行时,我是否遗漏了一些重要内容?预先感谢您的帮助。
最佳答案
出于安全原因,云服务提供商通常只允许应用程序从 Node 服务器使用一个端口(动态随机分配给 PORT
环境变量)。阅读 this section从 Heroku 文档了解更多相关信息。
这就是为什么使用 process.env.PORT
的主应用程序 (main.js) 正在运行,而另一个应用程序 (node-server.js )使用硬编码的 1234
则不然。
This question关于 Heroku 上多个端口的可行性有一些指示(不过,恐怕没有好消息)。
如何解决这个问题,可以尝试的一件事是将其分成两个单独的应用程序,分别使用单独的 package.json
等进行部署。
关于angularjs - 第二个 Node 服务器(或端口)不会在生产中启动 (Elastic Beanstalk),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33024705/