开发者应该如何在Node.js中使用环境变量?

2,001 阅读4分钟

「本文正在参与技术专题征文Node.js进阶之路,点击查看详情

前言

数据库名称数据库密码邮箱密码API Keys等常量,我们需要在Node.js的后端应用中存储它们以方便我们使用。但是这些常量的值会在不同的环境中具有不同的值,例如我们需要在测试环境测试我们的Node.js应用的时候,我们应该连接的是测试数据库,可千万不能连接成了生产环境的数据库!

应用开发者经常使用本地数据库进行开发和测试,并使用个人邮箱账户去发送邮件。当我们在发布生产环境前,我们的Node.js应用应该发布到预发布环境(staging环境)进行QA团队的测试。当通过测试后,所有的服务都应该准备进入生产(production环境)环境。所以,我们经常需要在我们的Node.js应用中维护至少3套或者更多的环境。

当Node.js应用的环境不同时,我们存储的常量的值也应该是不同的。这些常量的值应该在Node.js启动的时候被配置并存储。

环境变量

环境变量可以在应用级别或者操作系统级别被创建。

图1.png

相信每个开发者都很熟悉在Linux和Window这样的操作系统中管理环境变量。Node.js应用可以通过process.env读取这些环境变量。

但是如果一个开发者想通过某个本地文件(例如一个配置文件)去设置环境变量呢?Node.js应用也可以通过某个本地文件管理应用程序的环境变量(在其他后端语言中通常叫配置文件)。我们通常使用的的工具是[dotenv](https://www.npmjs.com/package/dotenv)

图2.png

我们可以通过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
  • 在应用顶层调用dotenvconfig 函数
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

部署步骤

  1. 登录Githbu账号并创建一个新的仓库

图3.png

我们将这个仓库的名称设置为env_demo,如果你的项目需要设置成私有的,你应该选择Private这个选项。

图4.png

  1. 修改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);
  1. 添加.gitignore文件

添加.gitignore文件到项目的根目录下。我们可以通过.gitignore文件说明哪些文件不应该被上传到Gtihub仓库中。在我们的项目中,我们不希望node_modules.env被上传,因为node_modules体积很大,通过npm自动安装是更好的做法。至于.env,我相信你不想你的数据库或服务器密码存在被泄露的风险。

图5.png

  1. 将仓库推送至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
  1. 在Heroku中创建账号
  2. 在Heroku中创建新的应用

图6.png

  1. 在Deployment method中选择基于Github仓库部署

图7.png

  1. 找到需要连接的Github仓库,点击需要部署的分支进行部署。部署完成后,可以点击【View】按钮在浏览器上查看该Node.js应用

图8.png 图9.png

  1. 当你查看应用的时候,你目前查看到的应该是一个空页面,没有我们期望的环境变量的JSON对象。那是因为你还没有在Heroku中配置环境变量。

配置环境变量

  • 点击【Settings】的tab,点击【Reveal Config Var】按钮

图10.png

  • 添加环境变量

图11.png

  • 重新测试

图12.png

总结

在Node.js根据不同环境配置环境变量是十分重要的。我们可以使用dotenv非常方便的在Node.js应用中管理环境变量的值 ,dotenv会读取.env这个文件的配置作为环境变量。更多的dotenv的使用,请参考:www.npmjs.com/package/dot…