process.env.PORT 是未定义的(在 LinuxCloud 环境中)



我一直在 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并使参数可用于应用。这主要是为了开发方便。

最新更新