【问题标题】:How nodejs reads and writes .env files?nodejs如何读写.env文件?
【发布时间】:2020-12-11 12:58:35
【问题描述】:

如何读写env文件?

原文件:

# I am a note ...
key1=value1

key2=value2
   # I am a note ...

我需要一个函数setEnv(key, value)

运行setEnv('key1', 'value2'),让它变成:

# I am a note ...
key1=value2

key2=value2
   # I am a note ...

我怎样才能实现它?

【问题讨论】:

  • 所有你需要做的就是在第一个= 上分割每一行并将原始值写入它。 .env 文件中没有转义之类的东西。我认为没有理由用节点 tho 编辑文件。阅读我通常使用npmjs.com/package/dotenv

标签: javascript node.js


【解决方案1】:

让我们从创建新项目开始。

mkdir folder_name
cd folder_name
npm init

然后在您的项目目录中安装“envfile”和“dotenv”。 安装envfile的命令是

npm install envfile --save

同样安装 dotenv

npm install dotenv --save

package dotenv 直接读取 .env 文件 package envfile 用于根据需要对文件进行解析和字符串化。 使用您的详细信息在项目目录中创建.env 文件。

# I am a note ...
key1=value1

key2=value2
   # I am a note ...

使用filename.js 创建一个新文件

在获取和设置环境变量之后,您可以使用以下代码。

const fs = require('fs');
require('dotenv').config()
const {
    parse,
    stringify
} = require('envfile');
const pathToenvFile = '.env';

/**
 * 
 * @param {string} key 
 * //Function to get value from env
 */
function getEnv(key) {
    console.log("Getting value of " + key);
    console.log(process.env[key]);
}
//Calling the function getEnv
getEnv("key1");


/**
 * 
 * @param {string} key 
 * @param {string} value 
 * //Function to set environment variables.
 */
function setEnv(key, value) {
    fs.readFile(pathToenvFile, 'utf8', function (err, data) {
        if (err) {
            return console.log(err);
        }
        var result = parse(data);
        result[key] = value;
        console.log(result);
        fs.writeFile(pathToenvFile, stringify(result), function (err) {
            if (err) {
                return console.log(err);
            }
            console.log("File Saved"); // Can be commented or deleted
        })

    });
}
//Calling the function setEnv
setEnv('key1', 'value2');

在此之后运行您的文件

node filename.js

你可以得到你想要的输出。

初始 .env 文件

# I am a note ...
key1=value1

key2=value2
   # I am a note ...

运行程序后

key1=value2
key2=value2

是的,你的 cmets 被删除了。

【讨论】:

    【解决方案2】:

    您可以按照here 的描述使用envfile 模块。

    const fs = require('fs');
    const envfile = require('envfile');
    const envPath = 'pathToEnvFile/.env';
    let parsedFile = envfile.parseFileSync(envPath);
    parsedFile.NEW_VAR = 'newVariableValue';
    fs.writeFileSync(envPath, envfile.stringifySync(parsedFile));
    

    【讨论】:

    • 但不输出# note
    • 这是由于模块只解析实际的键值对。您可以手动解析每一行,但这似乎很容易出错。您还需要以编程方式设置 cmets 吗?
    【解决方案3】:

    类似这样的:

    function setEnv(envText, key, value) {
      if (!envText) {
        return;
      }
      const rp = new RegExp(`${key}=(.*?)\\s`);
      let result = envText.replace(rp, (m, $1) => {
        return m.replace($1, value);
      });
      if (!rp.test(result)) {
        result += `\n${key}=${value}`;
      }
      return result;
    }
    
    console.log(
      setEnv(
        `# I am a note ...
      key1=value1
      
      key2=value2
         # I am a note ...`,
        'key1',
        'value2',
      ),
    );

    但这不起作用:

    setEnv(
        `# I am a note ...
      key1=value1
      
      key2=value2`,
        'key2',
        'value1',
      )
    
    setEnv(
        `# I am a note ...
      key1key2=value1
      
      key2=value2`,
        'key2',
        '2222',
      )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-01
      • 1970-01-01
      • 2020-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-17
      • 1970-01-01
      相关资源
      最近更新 更多