一段时间以来,我一直在C9上开发一个nodejs应用程序,现在我正尝试在远程主机上复制它。到目前为止,在新环境中,node app.js
可以在控制台中运行,但是无法在浏览器中查看网站。
似乎是端口问题。 我的app.js文件是这样的:
var express = require("express"),
app = express();
(...)
app.listen(process.env.PORT, process.env.IP, function(){
console.log(process.env.PORT);
console.log("The YelpCamp Server Has Started!");
});
在C9环境中,日志告诉我process.env.PORT是8080。但是在新环境中,日志告诉我process.env.PORT是未定义的。
我该如何解决?
除了我的远程操作系统是Linux而不是Windows之外,这与该较早的question类似。这个问题的答案说,应该“修改web.config文件”,但是我在远程主机上找不到它,而且我不确定它在Linux和Windows下的工作方式是否相同。
答案 0 :(得分:2)
process.env
变量由“环境”设置。基本上,它们充当对系统环境变量的访问。尝试访问process.env.PORT
时,如果尚未在要运行系统的shell中设置该环境变量,它将返回undefined
。
您可以使用以下命令在运行node app.js
之前设置环境变量。
$ PORT=8080
$ node app.js
在这种情况下,我们在现有外壳中设置环境变量,然后使用app.js文件调用node。环境变量从父进程传递到它们启动的进程,如果您依次运行这两个进程,则将在当前shell中设置一个环境变量,然后node
会在启动时接收到它在所有其他环境变量旁边)。
要查看现有节点进程可用的所有环境变量,可以运行console.log(process.env);
。
process.env.IP
也是如此。
侧面说明:C9和其他类似环境通常具有很多预设的环境变量。这就是为什么它在C9上可用。 Heroku也是如此,这是因为其系统必须规定您的服务应使用的端口,以便可以为该端口预先配置其负载均衡器/反向代理。
答案 1 :(得分:2)
我遇到了类似的情况,如果无法从环境中读取一个端口,最终提供了默认端口号。
const PORT = process.env.PORT || 8080;
app.listen(PORT, ...)
答案 2 :(得分:1)
部署节点项目文件后,您需要确保所有环境变量也被传输。
1.手动复制粘贴环境变量
从原来的主机配置到新的主机配置。使用两端的仪表板。简单安全。
--- 或 ---
2.从项目根目录手动传输 .env 文件
(不推荐用于生产环境)Node 项目通常在根目录中有一个 .env 文件,它通常被排除在文件传输之外(出于明显的安全原因)。您需要确保新主机在根目录中也具有相同的 .env 文件。对于生产环境,出于安全原因,通常不希望这样做,最好使用选项 #1。
使用此方法的项目很可能使用 dotenv 包,该包检测 .env
并使参数可用于您的应用。主要是为了开发方便。