模块dotenv的使用及源码解读

216 阅读2分钟

dotenv是一个Node.js的npm模块,能够帮助管理项目的配置。通过在项目中创建名为.env的文件,可以在其中定义变量,并在Node.js中使用dotenv模块将这些变量与process.env对象合并。这样做可以避免将敏感信息硬编码到代码中,同时方便管理不同环境的配置。dotenv还支持自定义配置文件名,以及在项目中使用多个配置文件。

以下是在Nodejs项目中使用dotenv的步骤:

如何使用

  1. 通过npm安装dotenv模块: npm install dotenv
  2. 在你的项目中创建一个名为.env的文件(默认必须是.env文件名,当然也可以通过配置修改),在这个文件中定义你的变量,例如:
    PORT=3000
    DATABASE_URL=mongodb://localhost/mydatabase
    
  3. 在nodejs使用dotenv模块
    require('dotenv').config()
    
    const port = process.env.PORT
    const databaseUrl = process.env.DATABASE_URL
    

如何修改dotenv配置文件名称

.env文件名是默认的,如果你想使用不同的文件名来存储环境变量,可以使用dotenvconfig函数,并传递一个path选项,该选项可以指定文件的路径和名称,例如

const dotenv = require('dotenv');
const path = require('path');

dotenv.config({ path: path.resolve(__dirname, '.env.production') });

如何配置多个文件

可以如下:

require('dotenv').config({ path: '.env.dev' });
require('dotenv').config({ path: '.env.prod' });

另外也可以将多个配置放到一个数组里面,然后传递给config方法

dotenv核心源码

  1. nodejs中process.cwd()可以获取当前程序执行的目录,然后在当前执行的目录下查找配置文件,所以配置文件必须放在执行命令同级别;
  2. 使用Object.prototype.hasOwnProperty.call(process.env, key)判断当前环境有没有定义变量,如果没有才会把设置此key的值;
const fs = require("fs");
const path = require("path");
 
function config(options) {
  const encoding = options.encoding || "utf8";
  const silent = options.silent || false;
  const pathToFile = path.resolve(process.cwd(), options.path || ".env");
  let parsed;
  try {
    // 读取 .env 文件
    const src = fs.readFileSync(pathToFile, { encoding });
    parsed = parse(src);

    // 将 .env 文件中的环境变量设置到 process.env 上
    Object.keys(parsed).forEach((key) => {
      if (!Object.prototype.hasOwnProperty.call(process.env, key)) {
        process.env[key] = parsed[key];
      } else if (!silent) {
        console.warn(`\"${key}\" is already defined in \`process.env\` and will not be overwritten`);
      }
    });