使用dotenv
保护Node.js项目中的密钥与凭证
前言
在现代软件开发中,保护敏感信息如API密钥、数据库凭证等至关重要。Node.js作为一个广泛应用的服务器端JavaScript运行环境,提供了多种方式来保护这些信息。
本文将介绍如何使用dotenv
模块来保护Node.js项目中的密钥,并详细说明操作步骤。
使用dotenv
保护密钥
关于dotenv
dotenv
是一个零依赖模块,能够将环境变量从.env
文件加载到process.env
中。这样可以避免将敏感信息硬编码在代码中,有效保护密钥。
相关资料
dotenv库(环境变量和模式) - 知乎 (zhihu.com)
操作步骤
-
在项目文件夹中使用
npm i dotenv
安装依赖。 -
在项目文件夹中新建
.env
文件。在文件中添加:API_KEY = 你的api-key
-
在项目中引入
dotenv
模块并引入config()
方法。其作用是将.env
文件中的变量添加到Node.js项目进程的环境变量对象中。require('dotenv').config();
-
现在可以使用
process.env.API_KEY
这个变量替代你的api-key
。 -
在
.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
文件。这些文件可以帮助管理环境特定的配置。
-
.env
包含所有环境的默认变量。适合在开发环境中使用。
API_KEY=dev-api-key DATABASE_URL=dev-database-url
-
.env.local
本地覆盖配置文件,适用于本地开发时的特定环境变量。此文件会覆盖
.env
文件中的变量。API_KEY=local-api-key
-
.env.development
包含开发环境特定的变量。通常用于开发团队共享的开发环境配置。
API_KEY=dev-api-key DATABASE_URL=dev-database-url
-
.env.test
包含测试环境特定的变量。用于在测试环境中运行应用程序时的配置。
API_KEY=test-api-key DATABASE_URL=test-database-url
-
.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)
- 为进程绑定事件处理器。常用事件包括
exit
、uncaughtException
、warning
等。
- 为进程绑定事件处理器。常用事件包括
-
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); // 输出警告堆栈 });
-