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

时间:2018-10-05 12:56:47

标签: node.js express

一段时间以来,我一直在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下的工作方式是否相同。

3 个答案:

答案 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 并使参数可用于您的应用。主要是为了开发方便。