无法让 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 固定到屏幕底部