validation我的node.js实例是开发还是生产
现在,无论何时我想将node.js服务器部署到生产服务器,我都需要更改所有IP / DNS /用户名/密码,以便连接到我的数据库和外部API。
这个过程是烦人的,有没有办法来validation当前正在运行的node.js实例是在cloud9ide还是实际上我的生产joyent smartmachine?
如果我能够(在我的运行代码中)运行我的node.js实例的服务器,我将添加一个条件,将值设置为prod或dev。
谢谢
通常你应该在生产环境中运行一个节点应用程序
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);
资源:
你如何检测express.js应用程序的环境?
我认为设置环境的最简单方法是将命令行parameter passing给应用程序。
node ./server.js dev
在你的脚本中,你需要处理这个参数并设置你需要的configuration。
var env = process.argv[2] || 'dev'; switch (env) { case 'dev': // Setup development config break; case 'prod': // Setup production config break; }
另外,我创build了模块 ,使configuration过程更容易一些。 也许它会帮助你。
实际上,我不build议在实际的应用程序代码中存储像数据库连接信息,密码,访问令牌等configuration值,原因如下:
-
对这些值进行硬编码使得以后难以改变它们。 您将不得不发布新版本的应用程序来更改这些值。
-
这是严重的安全违规,因为生产级的configuration数据和密码不应该存储在代码中。 泄露这些敏感数据非常容易。
更好的方法是将这些数据外部化,并在执行过程中将其传递给您的应用程序。 这通常是通过环境variables来完成的。 您只需要为每个需要在不同环境之间进行更改的和平数据定义唯一的环境variables。
例如: 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
实际上,这个值可以被encryption并添加到代码库中,然后在部署过程中解密。 但是,请确保将解密密钥安全地存储在部署系统中或由发布工程师交互提供。 可出租允许开箱即用。
在开发环境中变得更简单,因为你可以使用非常方便的dotenv
模块 。 只需在项目的根目录中创build一个.env
文件,并将所有variables添加到它:
DB_HOST=1.2.3.4 DB_USER=someusername DB_PASSWORD=somerandompassword
但是,请确保将其从您的VCS中排除,因为每个开发人员可能都希望进行个人configuration。 您可以创build一个.env.dist
文件来包含默认configuration,稍后可以将其用作模板: cp .env.dist .env
。
另外,我已经实现了一个可重用模块,它允许通过分析CLI参数和NODE_ENVvariables来自动检测环境。 这可能对你的开发机器很有用,因为你可以通过给你的Node.js程序如下这样简单地改变环境: $ node app.js --prod
。 使用Gulp也很好: $ gulp build --prod
。
请在detect-environment
的页面上查看更多的细节和用例。