iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >dotenv怎么从.env文件中读取环境变量
  • 557
分享到

dotenv怎么从.env文件中读取环境变量

2023-07-04 21:07:01 557人浏览 独家记忆
摘要

这篇文章主要讲解了“dotenv怎么从.env文件中读取环境变量”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“dotenv怎么从.env文件中读取环境变量”吧!引言dotenv从.env文件

这篇文章主要讲解了“dotenv怎么从.env文件中读取环境变量”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“dotenv怎么从.env文件中读取环境变量”吧!

    引言

    dotenv.env文件中读取环境变量,然后将其添加到process.env中。这是一个非常简单的库,但是它在开发中非常有用,因为它允许你在.env文件中存储敏感信息,而不是将其存储在代码中。

    现在很多库都支持.env文件,例如create-React-appVue-clinext.js等。

    使用

    根据READMEdotenv只有两个方法:

    • config:读取.env文件并将其添加到process.env中。

    • parse:解析一段包含环境变量的字符串Buffer,并返回一个对象。

    const dotenv = require('dotenv')// 读取.env文件并将其添加到process.env中dotenv.config()// 解析一段包含环境变量的字符串或Buffer,返回一个对象const config1 = dotenv.parse('FOO=bar\nBAR=foo')console.log(config1) // { FOO: 'bar', BAR: 'foo' }const buffer = Buffer.from('FOO=bar\nBAR=foo')const config2 = dotenv.parse(buffer)console.log(config2) // { FOO: 'bar', BAR: 'foo' }

    可以看到,dotenv的使用非常简单,通常我们只需要调用config方法即可。

    还有一种方法是预加载,直接通过node -r dotenv/config来运行脚本,这样就不需要在脚本中引入dotenv了。

    源码

    源码在lib/main.js中,先来看一下全部的代码:

    const fs = require('fs')const path = require('path')const os = require('os')const packageJSON = require('../package.json')const version = packageJson.versionconst LINE = /(?:^|^)\s*(?:export\s+)?([\w.-]+)(?:\s*=\s*?|:\s+?)(\s*'(?:\'|[^'])*'|\s*"(?:\"|[^"])*"|\s*`(?:\`|[^`])*`|[^#\r\n]+)?\s*(?:#.*)?(?:$|$)/mg// Parser src into an Objectfunction parse (src) {  const obj = {}  // Convert buffer to string  let lines = src.toString()  // Convert line breaks to same fORMat  lines = lines.replace(/\r\n?/mg, '\n')  let match  while ((match = LINE.exec(lines)) != null) {    const key = match[1]    // Default undefined or null to empty string    let value = (match[2] || '')    // Remove whitespace    value = value.trim()    // Check if double quoted    const maybeQuote = value[0]    // Remove surrounding quotes    value = value.replace(/^(['"`])([\s\S]*)\1$/mg, '$2')    // Expand newlines if double quoted    if (maybeQuote === '"') {      value = value.replace(/\n/g, '\n')      value = value.replace(/\r/g, '\r')    }    // Add to object    obj[key] = value  }  return obj}function _log (message) {  console.log(`[dotenv@${version}][DEBUG] ${message}`)}function _resolveHome (envPath) {  return envPath[0] === '~' ? path.join(os.homedir(), envPath.slice(1)) : envPath}// Populates process.env from .env filefunction config (options) {  let dotenvPath = path.resolve(process.cwd(), '.env')  let encoding = 'utf8'  const debug = Boolean(options && options.debug)  const override = Boolean(options && options.override)  if (options) {    if (options.path != null) {      dotenvPath = _resolveHome(options.path)    }    if (options.encoding != null) {      encoding = options.encoding    }  }  try {    // Specifying an encoding returns a string instead of a buffer    const parsed = DotenvModule.parse(fs.readFileSync(dotenvPath, { encoding }))    Object.keys(parsed).forEach(function (key) {      if (!Object.prototype.hasOwnProperty.call(process.env, key)) {        process.env[key] = parsed[key]      } else {        if (override === true) {          process.env[key] = parsed[key]        }        if (debug) {          if (override === true) {            _log(`"${key}" is already defined in `process.env` and WAS overwritten`)          } else {            _log(`"${key}" is already defined in `process.env` and was NOT overwritten`)          }        }      }    })    return { parsed }  } catch (e) {    if (debug) {      _log(`Failed to load ${dotenvPath} ${e.message}`)    }    return { error: e }  }}const DotenvModule = {  config,  parse}module.exports.config = DotenvModule.configmodule.exports.parse = DotenvModule.parsemodule.exports = DotenvModule

    可以看到最后导出的是一个对象,包含了configparse两个方法。

    config

    config方法的作用是读取.env文件,并将其添加到process.env中。

    function config (options) {  let dotenvPath = path.resolve(process.cwd(), '.env')  let encoding = 'utf8'  const debug = Boolean(options && options.debug)  const override = Boolean(options && options.override)}

    首先定义了一些变量:

    • dotenvPath.env文件的路径

    • encoding是文件的编码

    • debugoverride分别表示是否开启调试模式和是否覆盖已有的环境变量。

    if (options) {  if (options.path != null) {    dotenvPath = _resolveHome(options.path)  }  if (options.encoding != null) {    encoding = options.encoding  }}

    然后判断了一下options是否存在,如果存在的话,就会根据options的值来修改dotenvPathencoding的值。

    const parsed = DotenvModule.parse(fs.readFileSync(dotenvPath, { encoding }))

    然后是调用parse方法来解析.env文件,parse方法的实现在下面会讲到。

    这里是只用fs.readFileSync来读取.env文件,然后将其传入parse方法中,接着往下:

    Object.keys(parsed).forEach(function (key) {    if (!Object.prototype.hasOwnProperty.call(process.env, key)) {        process.env[key] = parsed[key]    } else {        if (override === true) {            process.env[key] = parsed[key]        }        if (debug) {            if (override === true) {                _log(`"${key}" is already defined in `process.env` and WAS overwritten`)            } else {                _log(`"${key}" is already defined in `process.env` and was NOT overwritten`)            }        }    }})

    这里是遍历parsed对象,然后将其添加到process.env中,如果process.env中已经存在了该环境变量,那么就会根据override的值来决定是否覆盖。

    debug的值表示是否开启调试模式,如果开启了调试模式,那么就会打印一些日志

    最后就是直接返回parsed对象。

    parse

    parse方法的作用是解析.env文件,将其转换为一个对象。

    const LINE = /(?:^|^)\s*(?:export\s+)?([\w.-]+)(?:\s*=\s*?|:\s+?)(\s*'(?:\'|[^'])*'|\s*"(?:\"|[^"])*"|\s*`(?:\`|[^`])*`|[^#\r\n]+)?\s*(?:#.*)?(?:$|$)/mgfunction parse (src) {  const obj = {}  // Convert buffer to string  let lines = src.toString()  // Convert line breaks to same format  lines = lines.replace(/\r\n?/mg, '\n')  let match  while ((match = LINE.exec(lines)) != null) {    const key = match[1]    // Default undefined or null to empty string    let value = (match[2] || '')    // Remove whitespace    value = value.trim()    // Check if double quoted    const maybeQuote = value[0]    // Remove surrounding quotes    value = value.replace(/^(['"`])([\s\S]*)\1$/mg, '$2')    // Expand newlines if double quoted    if (maybeQuote === '"') {      value = value.replace(/\n/g, '\n')      value = value.replace(/\r/g, '\r')    }    // Add to object    obj[key] = value  }  return obj}

    首先定义了一个正则表达式LINE,用来匹配.env文件中的每一行。

    然后是将src转换为字符串,然后将换行符统一为\n

    接着就是核心,通过正则表达式的特性通过while循环来匹配每一行。

    这个正则着实有点复杂,我是正则渣渣,可以在regex101查看一下。

    dotenv怎么从.env文件中读取环境变量

    这个正则上面标出了三种颜色,和下面的匹配的值的颜色相互对应,然后右边会展示匹配的值。

    这里我不过多解读,可以自己去看一下,然后输入不同的值对比一下结果。

    通过上面的截图可以看到匹配会捕获两个值,第一个是环境变量的名称,第二个是环境变量的值。

    然后对值进行处理,首先去掉首尾的空格,然后通过正则去掉首尾的引号,最后再将转义的换行符转换还原。

    经过上面的处理,就可以将每一行的环境变量添加到obj对象中了,最后返回obj对象。

    感谢各位的阅读,以上就是“dotenv怎么从.env文件中读取环境变量”的内容了,经过本文的学习后,相信大家对dotenv怎么从.env文件中读取环境变量这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

    --结束END--

    本文标题: dotenv怎么从.env文件中读取环境变量

    本文链接: https://www.lsjlt.com/news/347435.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    本篇文章演示代码以及资料文档资料下载

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档
    猜你喜欢
    • dotenv怎么从.env文件中读取环境变量
      这篇文章主要讲解了“dotenv怎么从.env文件中读取环境变量”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“dotenv怎么从.env文件中读取环境变量”吧!引言dotenv从.env文件...
      99+
      2023-07-04
    • dotenv源码解读从.env文件中读取环境变量
      目录引言使用源码configparse总结引言 dotenv从.env文件中读取环境变量,然后将其添加到process.env中。这是一个非常简单的库,但是它在开发中非常有用,因为它...
      99+
      2022-12-25
      dotenv .env文件读取环境变量 dotenv .env
    • vue中.env文件配置环境变量的实现
      目录1️⃣ 文件说明2️⃣ 内容格式3️⃣ 加载4️⃣ 优先级5️⃣ 项目中的使用.env 文件配置 1️⃣ 文件说明 .env:全局默认配置文件,无论什么环境都会加载合并。 .en...
      99+
      2023-05-14
      vue .env配置环境变量 vue .env 环境变量
    • linux怎么读取文件中的变量
      在Linux中,可以使用以下命令来读取文件中的变量:1. 使用source命令:source命令用于在当前Shell环境中执行指定文...
      99+
      2023-08-08
      linux
    • VB.NET中怎么获取环境变量
      本篇文章为大家展示了VB.NET中怎么获取环境变量,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Windows系统将很多重要的信息(比如计算机名和用户名)存储在环境变量中。访问这些变量来获取这些信息...
      99+
      2023-06-17
    • 用sudo命令无法读取环境变量怎么办
      小编给大家分享一下用sudo命令无法读取环境变量怎么办,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!通过sudo -l来查看sudo的限制:$ sudo -lMa...
      99+
      2023-06-12
    • linux环境变量配置文件怎么生效
      在Linux环境中,配置文件的生效方式取决于不同的配置文件和操作系统。1. 对于系统级别的环境变量配置文件,如`/etc/profi...
      99+
      2023-09-15
      linux
    • Linux中怎么对环境变量文件进行备份
      这篇文章将为大家详细讲解有关Linux中怎么对环境变量文件进行备份,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。bzip2 命令 在shell 提示下输入命令:压缩文件:bzip2 filena...
      99+
      2023-06-28
    • linux中环境变量配置在什么文件
      这篇文章主要介绍“linux中环境变量配置在什么文件”,在日常操作中,相信很多人在linux中环境变量配置在什么文件问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”linux中环境变量配置在什么文件”的疑惑有所...
      99+
      2023-07-02
    • 怎么用BAT创建文件夹文件及回显环境变量
      这篇文章主要为大家展示了“怎么用BAT创建文件夹文件及回显环境变量”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“怎么用BAT创建文件夹文件及回显环境变量”这篇文章吧。1、创建文件夹:mdmd&n...
      99+
      2023-06-29
    • Linux系统中怎么清理文件和清理环境变量
      本篇内容主要讲解“Linux系统中怎么清理文件和清理环境变量”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Linux系统中怎么清理文件和清理环境变量”吧!使用 Find 命令来帮你找到那些需要清...
      99+
      2023-06-12
    • PHP怎么从txt文件中读取数据
      这篇文章主要介绍了PHP怎么从txt文件中读取数据,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、打开/关闭文件对文件操作时首先要打开文件,打开文件用 fopen()函数,...
      99+
      2023-06-29
    • 云服务器怎么搭建python环境变量包文件
      以下是一个使用Python编写服务器搭建过程的示例代码,其中包含了服务器配置文件和依赖管理器。 ```python import cron 设置网络连接 dns = {"localhost": "123456", "remote doma...
      99+
      2023-10-26
      环境变量 服务器 文件
    • 云服务器怎么搭建python环境变量包文件夹
      以下是一个使用Python的标准命令行搭建Python环境变量包文件夹的示例,其中包含一个命令行变量: ```python import os ospath = ['path/to/var/to/file.'] ospath.extend...
      99+
      2023-10-26
      文件夹 环境变量 服务器
    • Node中的模块化、文件系统与环境变量怎么应用
      这篇文章主要讲解了“Node中的模块化、文件系统与环境变量怎么应用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Node中的模块化、文件系统与环境变量怎么应用”吧!一、Node.js模块化1...
      99+
      2023-07-04
    • 云服务器怎么搭建python环境变量包文件管理
      以下是一个使用Python 2.x版本搭建Python环境变量包文件管理的示例代码: 创建Python环境变量 打开文件包中的文件和数据 file_path="example.py" data={ "path":"example....
      99+
      2023-10-26
      文件管理 环境变量 服务器
    • Python怎么从csv文件中读取数据及提取数据
      本篇内容主要讲解“Python怎么从csv文件中读取数据及提取数据”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python怎么从csv文件中读取数据及提取数据”吧!数据保存在csv文件中1.从...
      99+
      2023-06-25
    • 云服务器怎么搭建python环境变量管理系统文件
      要搭建一个python环境变量管理系统,可以按照以下步骤进行: 安装 PyCharm 模块:PyCharm 是一个简单易用的文本编辑器,可以搭建环境变量管理系统。下面是一个简单的安装示例: pip install python 步...
      99+
      2023-10-26
      管理系统 环境变量 服务器
    • 云服务器怎么搭建python环境变量管理系统文件夹
      要搭建一个python环境变量管理系统,可以按照以下步骤进行: 安装Python3 安装pip:pip install pip-python 配置python环境变量 python -i -p -p -p': -c # 设置环境变量 `...
      99+
      2023-10-26
      管理系统 文件夹 环境变量
    • 云服务器怎么搭建python环境变量包文件管理系统
      搭建一个Python环境变量管理系统可以帮助管理和配置系统环境变量,以及在运行应用程序时提供所需的功能。下面是一个简要的Python环境变量包文件管理器的例子: 打开命令行: python pip install -s mysqli_...
      99+
      2023-10-26
      管理系统 环境变量 服务器
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作