现在,每当我想将node.js服务器部署到我的生产服务器时,我需要更改我的数据库和外部API的各种连接的所有IP / DNS /用户名/密码。
这个过程很烦人,有没有办法验证当前正在运行的node.js实例是否在cloud9ide中,或者实际上是我的生产中的joyent smartmachine?
如果我能够在我的运行代码中运行我的node.js实例运行的服务器,我将添加一个条件,将值设置为prod或dev。
谢谢
答案 0 :(得分:75)
通常,您应该在生产中运行节点应用程序,如下所示:
NODE_ENV=production node app.js
Express,Socket.IO等应用程序使用process.env.NODE_ENV
来确定环境。
在开发过程中,您可以省略它,只需使用node app.js
正常运行应用程序。
您可以在代码中检测环境:
var env = process.env.NODE_ENV || 'dev';
loadConfigFile(env + '.json', doStuff);
资源:
答案 1 :(得分:14)
我认为设置环境最简单的方法是将命令行参数传递给您的应用程序。
node ./server.js dev
在你的脚本中,你需要处理这个参数并设置你需要的配置。
var env = process.argv[2] || 'dev';
switch (env) {
case 'dev':
// Setup development config
break;
case 'prod':
// Setup production config
break;
}
此外,我创建了module,使配置过程更容易一些。也许它会帮助你。
答案 2 :(得分:5)
实际上,我不建议存储配置值,如数据库连接信息,密码,访问令牌等实际应用程序代码内部,原因如下:
对这些值进行硬编码会使以后很难对其进行更改。您必须发布新版本的应用程序才能更改这些值。
这是严重的安全违规行为,因为生产级配置数据和密码不应存储在代码中。泄漏这些敏感数据非常容易。
更好的方法是外化此数据并在执行期间将其传递给您的应用程序。这通常通过环境变量来完成。您只需要为每个需要在不同环境之间更改的数据和平定义唯一的环境变量。
例如:DB_HOST
,DB_USER
,DB_PASSWORD
。然后你可以通过这种方式将这些值传递给你的应用程序:
$ NODE_ENV=production DB_HOST=1.2.3.4 DB_USER=someusername DB_PASSWORD=somerandompassword /bin/node app.js
实际上,这些值可以加密并添加到代码库中,然后在部署期间解密。但是,请确保解密密钥安全地存储在部署系统中,或由发布工程师以交互方式提供。开箱即用Shippable allows to do this。
在开发环境中,它变得更简单,因为您可以使用非常方便的dotenv
module。只需在项目的根目录中创建一个.env
文件,并将所有变量添加到其中:
DB_HOST=1.2.3.4
DB_USER=someusername
DB_PASSWORD=somerandompassword
但是,请确保将其从VCS中排除,因为每个开发人员可能都希望进行个人配置。您可以创建一个.env.dist
文件来包含默认配置,以后可以将其用作模板:cp .env.dist .env
。
另外,我实现了一个可重用的模块,它允许通过分析CLI参数和NODE_ENV变量来自动检测环境。这在您的开发机器上非常有用,因为您可以通过将CLI参数传递给Node.js程序来轻松更改环境,如下所示:$ node app.js --prod
。与Gulp一起使用也很好:$ gulp build --prod
。
请在detect-environment
's page上查看更多详情和用例。
答案 3 :(得分:0)
Npm config模块对于基于环境的设置和基于它的运行应用程序非常有用。请检查下面的链接