使用dotenv保护Node.js项目中的密钥与凭证

169 阅读4分钟

使用dotenv保护Node.js项目中的密钥与凭证

前言

在现代软件开发中,保护敏感信息如API密钥数据库凭证等至关重要。Node.js作为一个广泛应用的服务器端JavaScript运行环境,提供了多种方式来保护这些信息。

本文将介绍如何使用dotenv模块来保护Node.js项目中的密钥,并详细说明操作步骤。

使用dotenv保护密钥

关于dotenv

dotenv是一个零依赖模块,能够将环境变量从.env文件加载到process.env中。这样可以避免将敏感信息硬编码在代码中,有效保护密钥。

相关资料

dotenv - npm (npmjs.com)

dotenv库(环境变量和模式) - 知乎 (zhihu.com)

操作步骤

  1. 在项目文件夹中使用npm i dotenv安装依赖。

  2. 在项目文件夹中新建.env文件。在文件中添加:

    API_KEY = 你的api-key
    
  3. 在项目中引入dotenv模块并引入config()方法。其作用是将.env文件中的变量添加到Node.js项目进程的环境变量对象中。

    require('dotenv').config();
    
  4. 现在可以使用process.env.API_KEY这个变量替代你的api-key

  5. .gitignore文件中添加.env,使.env文件不会被上传到git上以保护api-key

高级用法

  • 指定路径 可以通过传递 path 选项来指定.env文件的位置:

    require('dotenv').config({ path: '/custom/path/to/your/.env' });
    
  • 指定编码 可以通过传递 encoding 选项来指定.env文件的编码(默认是utf8):

    require('dotenv').config({ encoding: 'latin1' });
    
  • 安全加载 使用dotenv-safe模块,可以确保所有必要的环境变量都定义在.env.example文件中,并且都被.env文件所覆盖:

    npm install dotenv-safe
    
    require('dotenv-safe').config({
      example: './.env.example',
    });
    

不同种类的.env文件

在实际开发中,通常会根据不同的环境(开发、测试、生产等)使用不同的.env文件。这些文件可以帮助管理环境特定的配置。

  1. .env

    包含所有环境的默认变量。适合在开发环境中使用。

    API_KEY=dev-api-key
    DATABASE_URL=dev-database-url
    
  2. .env.local

    本地覆盖配置文件,适用于本地开发时的特定环境变量。此文件会覆盖.env文件中的变量。

    API_KEY=local-api-key
    
  3. .env.development

    包含开发环境特定的变量。通常用于开发团队共享的开发环境配置。

    API_KEY=dev-api-key
    DATABASE_URL=dev-database-url
    
  4. .env.test

    包含测试环境特定的变量。用于在测试环境中运行应用程序时的配置。

    API_KEY=test-api-key
    DATABASE_URL=test-database-url
    
  5. .env.production

    包含生产环境特定的变量。此文件中的变量用于生产环境的配置。

    API_KEY=prod-api-key
    DATABASE_URL=prod-database-url
    

Github中推荐的关于.env文件的.gitignore

# dotenv environment variable files
.env
.env.development.local
.env.test.local
.env.production.local
.env.local

补充小记:Node.js中的process对象

process对象是Node.js中的一个全局对象,提供了对当前Node.js进程的信息和控制。env就是process对象的其中一个属性,用于读取系统环境变量。

  • 进程:分配资源的最小单位。类似于董事长。

  • 线程:进程执行的最小单位。类似于CEO。

  • 操作系统(OS)-> 进程(Process)-> 环境变量(env)-> 程序(Project)

常用属性

  • process.env

    • 包含用户环境的对象。可以通过此对象访问环境变量。
  • process.argv

    • 一个数组,包含了启动Node.js进程时的命令行参数。第一个元素是Node.js的可执行文件路径,第二个元素是当前执行的JavaScript文件路径,后续元素是命令行传入的参数。
  • process.pid

    • 当前进程的进程ID。
  • process.cwd()

    • 返回Node.js进程的当前工作目录。
  • process.version

    • Node.js的版本号。
  • process.versions

    • 包含Node.js及其依赖的版本信息的对象。

常用方法

  • process.exit([code])

    • 以退出码code结束当前进程。默认退出码是0,表示成功。
  • process.on(event, listener)

    • 为进程绑定事件处理器。常用事件包括exituncaughtExceptionwarning等。
  • process.chdir(directory)

    • 改变Node.js进程的当前工作目录。
  • process.memoryUsage()

    • 返回一个对象,描述Node.js进程的内存使用情况。
  • process.nextTick(callback)

    • 将回调函数放到下一个事件循环的顶部。在当前操作完成之后立即执行。

事件

  • exit

    • 当Node.js进程即将退出时触发。

    • 示例:

      process.on('exit', (code) => {
        console.log(`Process exiting with code: ${code}`);
      });
      
  • uncaughtException

    • 当一个异常冒泡回到事件循环,未被捕获时触发。

    • 示例:

      process.on('uncaughtException', (err) => {
        console.error('Unhandled exception:', err);
        process.exit(1);
      });
      
  • warning

    • 当Node.js发出进程警告时触发。

    • 示例:

      process.on('warning', (warning) => {
        console.warn(warning.name); // 输出警告名称
        console.warn(warning.message); // 输出警告信息
        console.warn(warning.stack); // 输出警告堆栈
      });