我一直在 C9 上开发一个 nodejs 应用程序一段时间,现在我正在尝试在我的远程主机上复制它。到目前为止,在新环境中,node app.js
控制台中工作,但我无法在浏览器中查看网站。
似乎这是一个端口问题。 我的应用程序.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。这个问题的答案是应该"修改web.config文件",但我在我的远程主机上找不到它,我不确定它在Linux和Windows下的工作方式相同。
process.env
变量由"环境"设置。基本上,它们充当对系统环境变量的访问。尝试访问process.env.PORT
时,如果您尚未在尝试运行系统的 shell 中设置该环境变量,它将返回undefined
。
您可以使用以下命令在运行node app.js
之前设置环境变量。
$ PORT=8080
$ node app.js
在这种情况下,我们在现有 shell 中设置环境变量,然后使用 app.js 文件调用 node。环境变量从父进程传递到它们启动的进程中,如果按顺序运行这两个进程,您将在当前 shell 中设置一个环境变量,然后node
启动时会收到该变量(以及所有其他环境变量(。
要查看现有节点进程可用的所有环境变量,您可以运行console.log(process.env);
。
对于process.env.IP
来说也是如此。
旁注:C9 和其他类似的环境通常有很多预设的环境变量。这就是为什么它在 C9 上可用的原因。Heroku 也是如此,这是因为他们的系统必须规定您的服务应使用的端口,以便可以为该端口预先配置他们的负载均衡器/反向代理。
我遇到了类似的事情,如果无法从环境中读取,最终会提供一个默认端口号。
const PORT = process.env.PORT || 8080;
app.listen(PORT, ...)
部署节点项目文件后,需要确保也传输所有 env 变量。
1. 手动复制粘贴环境变量
从原始主机配置到新的主机配置。使用任一端的仪表板。简单安全。
---或---
2. 从项目根目录手动传输 .env 文件
(不建议用于生产环境(节点项目通常在根目录中有一个 .env 文件,该文件通常从文件传输中排除(出于明显的安全原因(。您需要确保新主机在根目录中也具有相同的 .env 文件。对于生产环境,出于安全原因,通常不需要这样做,最好使用选项 #1。
使用此方法的项目可能使用 dotenv 包,该包可检测.env
并使参数可用于应用。这主要是为了开发方便。