Dotenv是零依赖模块,可将环境变量从项目根目录下的.env
文件加载到[process.env
]中(https://nodejs.org/docs/latest/api/process.html#process_process_env)。将配置与代码分开存储在环境中是基于“十二要素应用程序”方法的。
安装
npm install dotenv
用法
在您的项目的根目录中创建一个.env文件。以NAME=VALUE的形式在新行上添加特定于环境的变量。例如:
.env
DB_HOST=localhost
DB_USER=root
DB_PASS=s1mpl3
config.js
const dotenv = require('dotenv')
dotenv.config()
//process.env现在具有您在.env文件中定义的键和值。
//导出.env文件设置的变量,以供其他模块导入使用
module.exports = {
DB_HOST=localhost
DB_USER=root
DB_PASS=s1mpl3
} = process.env
process.env现在具有您在.env文件中定义的键和值。
在其他模块导入使用变量,例如:
/src/main.js
const app = require('./app/index')
const config = require('./app/config')
app.listen(config.APP_PORT, () => {
console.log(`服务器已启动在${config.APP_PORT}端口`)
})
Config
config
将读取您的.env
文件,解析内容,将其分配给 process.env
,并返回一个对象. 对象的parsed
键是一个对象,包含加载的内容.如果失败,则返回一个键error
,包含着错误。
Path
默认: path.resolve(process.cwd(), '.env'),其中process.cwd返回Node.js 进程的当前工作目录,也就是当前项目的根目录
如果包含环境变量的文件位于其他位置,则可以指定自定义路径。
require('dotenv').config({ path: '/full/custom/path/to/your/env/vars' })
Encoding
默认: utf8
您可以指定包含环境变量的文件的编码。
require('dotenv').config({ encoding: 'latin1' })
Debug
默认: false
您可以打开日志记录以帮助调试为什么某些键或值未按预期设置。
require('dotenv').config({ debug: process.env.DEBUG })
Parse
解析包含环境变量的文件内容的引擎是可以使用的,它接受一个String或Buffer并将返回一个带有已解析的键和值的Object。
const dotenv = require('dotenv')
const buf = Buffer.from('BASIC=basic')
const config = dotenv.parse(buf) // will return an object
console.log(typeof config, config) // object { BASIC : 'basic' }
options(此为Parse的可设置选项)
Debug
默认: false
您可以打开日志记录以帮助调试为什么某些键或值未按预期设置。
const dotenv = require('dotenv')
const buf = Buffer.from('hello world')
const opt = { debug: true }
const config = dotenv.parse(buf, opt)
// expect a debug message because the buffer is not in KEY=VAL form
Rules
解析引擎当前支持以下规则:
-
BASIC=basic
变成{BASIC: 'basic'}
- 空行被跳过
- 以
#
开头的行被视为注释 - 空值变成空字符串(
EMPTY=
成为{EMPTY: ''}
) - 保持内部引号(认为JSON)(
JSON={"foo": "bar"}
变为{JSON:"{\"foo\": \"bar\"}"
) - 空格从未加引号的值的两端删除(请参阅上的更多信息
trim
)(FOO= some value
成为{FOO: 'some value'}
) - 单引号和双引号被转义(
SINGLE_QUOTE='quoted'
成为{SINGLE_QUOTE: "quoted"}
) - 单引号和双引号的值在两端都保持空白(
FOO=" some value "
变为{FOO: ' some value '}
) - 双引号扩展新行(
MULTILINE="new\nline"
成为
{MULTILINE: 'new
line'}
常问问题
我应该提交我的.env
文件吗?
否。我们强烈建议您不要将.env
文件提交到版本控制。它应仅包含特定于环境的值,例如数据库密码或API密钥。生产数据库的密码应与开发数据库的密码不同。
我应该有多个.env
文件吗?
不能。我们强烈建议不要使用“主要”.env
文件和“环境”.env
文件,例如.env.test
。您的配置在部署之间应该有所不同,并且您不应该在环境之间共享值。
在一个十二因子应用程序中,环境变量是粒度控件,每个控件都与其他环境变量完全正交。它们从不作为“环境”组合在一起,而是针对每个部署进行独立管理。当应用在其生命周期内自然扩展到更多部署时,该模型可以平稳地扩展。
已经设置的环境变量会怎样?
我们将永远不会修改任何已设置的环境变量。特别是,如果文件中有一个变量.env
与环境中已经存在的变量发生冲突,则该变量将被跳过。.env
尽管不建议这样做,但您可以使用此行为在计算机特定的环境中覆盖所有配置。
如果要覆盖process.env
,可以执行以下操作:
const fs = require('fs')
const dotenv = require('dotenv')
const envConfig = dotenv.parse(fs.readFileSync('.env.override'))
for (const k in envConfig) {
process.env[k] = envConfig[k]
}
网友评论