「本文正在参与技术专题征文Node.js进阶之路,点击查看详情」
前言
像数据库名称、数据库密码、邮箱密码和API Keys等常量,我们需要在Node.js的后端应用中存储它们以方便我们使用。但是这些常量的值会在不同的环境中具有不同的值,例如我们需要在测试环境测试我们的Node.js应用的时候,我们应该连接的是测试数据库,可千万不能连接成了生产环境的数据库!
应用开发者经常使用本地数据库进行开发和测试,并使用个人邮箱账户去发送邮件。当我们在发布生产环境前,我们的Node.js应用应该发布到预发布环境(staging环境)进行QA团队的测试。当通过测试后,所有的服务都应该准备进入生产(production环境)环境。所以,我们经常需要在我们的Node.js应用中维护至少3套或者更多的环境。
当Node.js应用的环境不同时,我们存储的常量的值也应该是不同的。这些常量的值应该在Node.js启动的时候被配置并存储。
环境变量
环境变量可以在应用级别或者操作系统级别被创建。
相信每个开发者都很熟悉在Linux和Window这样的操作系统中管理环境变量。Node.js应用可以通过process.env读取这些环境变量。
但是如果一个开发者想通过某个本地文件(例如一个配置文件)去设置环境变量呢?Node.js应用也可以通过某个本地文件管理应用程序的环境变量(在其他后端语言中通常叫配置文件)。我们通常使用的的工具是[dotenv](https://www.npmjs.com/package/dotenv)
我们可以通过npm下载安装dotenv这个包,它将读取.env这个文件用作Node.js应用的环境变量。
开发Node.js应用
为了加深大家对如何使用dotenv管理环境变量的理解,我们将创建一个会部署在多个环境的Node.js应用。目前我们尝试部署这个Node.js应用到服务器上。
创建一个Node.js应用:
- 创建
package.json文件
npm init -y
- 安装
dotenv
npm i -S dotenv
- 在项目根目录创建一个
.env文件
DB_HOST=locahost
DB_USER=root
DB_PASS=your_password
EMAIL=testuser@gmail.com
- 在应用顶层调用
dotenv的config函数
require('dotenv').config()
- 通过
process.env获取环境变量的值
const DB_HOST = process.env.DB_HOST;
const DB_USER = process.env.DB_USER;
此时当我们启动Node.js应用,dotenv会自动的读取.env文件中的值并将其追加到process.env对象上。
下面的Node.js将会读取.env的值并返回给用户:
require('dotenv').config;
const http = require('http');
const ENV_VARS = {
dbHost: process.env.DB_HOST,
dbUser: process.env.DB_USER,
dbPass: process.env.DB_PASS,
email: process.env.EMAIL,
};
http
.createServer((req, res) => {
res.writeHead(200, { 'Content-Type': 'application/json' });
res.write(JSON.stringify(ENV_VARS));
res.end();
})
.listen(8080);
)
部署到Heroku
我们将结合Github将应用部署到Heorku上,来看看是如何Ndoe.js应用是如何读取环境变量的。
前提条件
- Github账号
- Heroku账号
- 工作机器上应该安装Git
部署步骤
- 登录Githbu账号并创建一个新的仓库
我们将这个仓库的名称设置为env_demo,如果你的项目需要设置成私有的,你应该选择Private这个选项。
- 修改
package.json
- 在
package.json中增加engines选项并填写Node.js的版本。这会指定Heroku为这个应用安装指定版本的Node.js。 - 添加
start启动脚本。Heroku将执行npm start启动这个应用
{
"name": "env_demo",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"start": "node index",
"test": "echo \"Error: no test specified\" && exit 1"
},
"engines": {
"node": "14.x"
},
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": {
"dotenv": "^10.0.0"
}
}
与此同时,我们应该修改index.js中的端口,还记得我们刚才指定的是8080端口吗?在Heroku项目中,端口号将有Heroku指定:
http
.createServer(function (req, res) {
res.writeHead(200, { "Content-Type": "application/json" });
res.write(JSON.stringify(ENV_VARS));
res.end();
})
.listen(process.env.PORT);
- 添加
.gitignore文件
添加.gitignore文件到项目的根目录下。我们可以通过.gitignore文件说明哪些文件不应该被上传到Gtihub仓库中。在我们的项目中,我们不希望node_modules和.env被上传,因为node_modules体积很大,通过npm自动安装是更好的做法。至于.env,我相信你不想你的数据库或服务器密码存在被泄露的风险。
- 将仓库推送至Github仓库中
git init
git add .
git commit -m "initial commit"
git remote add origin https://github.com/bewarusman/env_demo.git
git push origin master
- 在Heroku中创建账号
- 在Heroku中创建新的应用
- 在Deployment method中选择基于Github仓库部署
- 找到需要连接的Github仓库,点击需要部署的分支进行部署。部署完成后,可以点击【View】按钮在浏览器上查看该Node.js应用
- 当你查看应用的时候,你目前查看到的应该是一个空页面,没有我们期望的环境变量的JSON对象。那是因为你还没有在Heroku中配置环境变量。
配置环境变量
- 点击【Settings】的tab,点击【Reveal Config Var】按钮
- 添加环境变量
- 重新测试
总结
在Node.js根据不同环境配置环境变量是十分重要的。我们可以使用dotenv非常方便的在Node.js应用中管理环境变量的值 ,dotenv会读取.env这个文件的配置作为环境变量。更多的dotenv的使用,请参考:www.npmjs.com/package/dot…