无法让 NODE_ENV 在开班时粘在我的 MEAN 堆栈上

Posted

技术标签:

【中文标题】无法让 NODE_ENV 在开班时粘在我的 MEAN 堆栈上【英文标题】:Can't get NODE_ENV to stick on my MEAN stack on open shift 【发布时间】:2014-06-17 18:12:45 【问题描述】:

我有:

export NODE_ENV=production添加到app-root/data/.bashprofile(并且 echo $NODE_ENV 显示生产) 已尝试 rhc set-env NODE_ENV=production -a myapp 生成设置环境变量...服务器返回意外错误代码:501 在我的本地存储库中创建了一个 .openshift/action_hooks 目录,并将行 export NODE_ENV=production 添加到 start 和 pre_start 文件中,提交并推送到 openshift 也尝试了 .openshift/action_hooks/pre_start_*

在我的 server.js 文件的开头声明了一个根变量(如下面的@JuJoDi 提示),现在它看起来很精简:

var express = require('express'),
 routes = require('./routes'),
 api = require('./routes/api'),
 http = require('http'), 
 path = require('path'),
 everyauth = require('everyauth'), 
 connect = require('connect'),
 env = process.env.NODE_ENV ? process.env.NODE_ENV : "process.env.NODE_ENV is null";

然后我使用这条路线打印出来:

app.get('/version', function(req,res)
        res.json(
            "app.get('env')" : app.get('env'),
            "process.env.NODE_ENV" : process.env.NODE_ENV,
                            "Global env" : env
        );
    );

发生的情况是 app.get('env') 总是返回 'development' 而 process.env.NODE_ENV 根本不打印(空值)

有没有人知道为什么这不起作用?

更新

我创建了一个简约的节点服务器,但仍然无法让任何环境变量在开放班次上工作:

    var http = require('http');

    var port = process.env.OPENSHIFT_NODEJS_PORT || 3000;
    var ipaddress = process.env.OPENSHIFT_NODEJS_IP || process.env.OPENSHIFT_INTERNAL_IP || 'localhost';
    var env = process.env.NODE_ENV

    http.createServer(function (req, res) 
      res.writeHead(200, 'Content-Type': 'text/plain');
      res.end('' + process.env.NODE_ENV + "|" + env);
    ).listen(port, ipaddress);

【问题讨论】:

如果你用NODE_ENV=production node server.js启动你的服务器会发生什么 效果很好。但我相信我不能在 openshift 上做到这一点? 【参考方案1】:

我无法重现此问题。我认为您最初收到的 501 错误响应是造成问题的原因。

您应该能够通过在项目源文件夹中运行以下命令进行故障排除(将-a YOUR_APP_NAME 添加到每个命令的末尾以在其他地方运行):

    检查您当前的应用程序令牌列表:

    rhc 环境列表

    如果您列出了 NODE_ENV 的内容,请将其清除:

    rhc 未设置 NODE_ENV

    将您的NODE_ENV 设置为“生产”:

    rhc 环境设置 NODE_ENV="production"

    通过重新加载服务器、运行 rhc env list 或通过 SSH 连接到您的应用程序以直接检查系统环境来验证该值是否已设置:

    rhc SSH

    环境 | grep NODE_ENV

运行rhc help env 也提供了很多很好的使用信息。根据它们的编写方式,一些服务器需要重新加载才能获取新内容。

我认为在 OpenShift 上启动和运行 MEANStack 的最简单方法是使用 Yeoman's Angular-fullstack generator。它应该会自动为您配置环境。

【讨论】:

很高兴在 FreeNode IRC 上的#OpenShift 中帮助解决问题 好吧,今天当我重新审视这个问题并按照您的示例进行操作时,效果非常好。我不知道我是否更改了任何内容,或者 openshift 是否发生了某些事情。不过,非常感谢!【参考方案2】:

该闭包无权访问流程对象。上面那个试试

var env = process.env.NODE_ENV;

然后打印出来

app.get('/version', function(req,res)
        res.json(
            "app.get('env')" : app.get('env'),
            "process.env.NODE_ENV" : env
        );
    );

【讨论】:

感谢您的帮助。我尝试了你的想法,但它仍然不起作用。在我的本地 node.js 服务器上,即使在该范围内,闭包也可以访问该进程。 有趣,我刚刚在我的身上测试过,它肯定没有。这是var self = this 的情况。你运行的是什么版本的节点? 我正在运行 node.js v0.10.12【参考方案3】:

当你运行应用程序时,试试这个:

NODE_ENV=production npm start

用您启动应用程序的任何方式(node server 或其他方式)替换 npm start

当我在本地工作时,这就是我改变环境的方式。因为我通常希望它是development

如果未设置 process.env.NODE_ENV,Express.js 将默认 app.get('env')development

更新:

抱歉,错过了 OpenShift 部分:/

https://www.openshift.com/developers/openshift-environment-variables

看来OpenShift中的环境变量需要进去:

.openshift/action_hooks/build

使用export。你试过吗?

【讨论】:

谢谢约翰尼,这在我的本地机器上运行良好。实际上,仅使用 OpenShift 环境我在本地没有问题。在 openshift 上部署时,我根本无法让任何自定义环境变量起作用。

以上是关于无法让 NODE_ENV 在开班时粘在我的 MEAN 堆栈上的主要内容,如果未能解决你的问题,请参考以下文章

CollectionView "Header" 像 instagram 一样滚动时粘在顶部

粘性侧边栏:向下滚动时固定在底部,向上滚动时固定在顶部

如何在 UIScrollView 中将 UIToolbar 固定到屏幕底部

UITableview:部分标题不会自动调整全屏点击的位置

我无法在两个 div 中间创建一个分区,我的页脚也没有粘在底部

使用 UITableViewController 时如何让 pickerView 粘在底部?