【问题标题】:How to insert the .env into a folder and run the nodemon?如何将 .env 插入文件夹并运行 nodemon?
【发布时间】:2018-12-27 00:26:59
【问题描述】:

SERVER.JS 恢复 DOTENV

const dotenv   = require('dotenv-safe');
this.dotenv   = dotenv.load();

问题:

1) 如果 nodemon 只有 .env 文件,我无法运行它,它只有在它包含 .env 和 .env.example 文件时才运行,我想知道原因和如何正确匹配。

2)如何在/env文件夹中插入.env而不出现问题nodemon?

3) 在我的package.json 启动脚本中是以下"start_dev": "nodemon app/backend/src/start.js",但是它给出了以下错误:

nodemon app / backend / src / start.js
[nodemon] 1.18.9
[nodemon] to restart at any time, enter `rs`
[nodemon] watching: *. *
[nodemon] starting `node app / backend / src / start.js`
consign v0.1.6 Initialized in C: \ Users \ THIAGOSAAD \ Documents \ DEVELOPMENT \ NEORIS \ ALIANSCE \ aliansce-app-analyticals-panel
fs.js: 115
    throw err;
    ^

Error: ENOENT: no such file or directory, open '.env.example'
    at Object.openSync (fs.js: 436: 3)
    at Object.readFileSync (fs.js: 341: 35)
    C: \ Users \ THIAGOSAAD \ Documents \ DEVELOPMENT \ NEORIS \ ALIANSCE \ aliansce-app-analyticals-panel \ node_modules \ dotenv-safe \ index.js: 27: 45)
    at new Application (C: \ Users \ THIAGOSAAD \ Documents \ DEVELOPMENT \ NEORIS \ ALIANSCE \ aliansce-app-analyticals-panel \ app \ backend \ src \ config \ server.js: 11: 32)
    at-the-object. <anonymous> (C: \ Users \ THIAGOSAAD \ Documents \ DEVELOPMENT \ NEORIS \ ALIANSCE \ aliansce-app-analyticals-panel \ app \ backend \ src \ config \ server.js: 65: 18)
    at Module._compile (internal / modules / cjs / loader.js: 688: 30)
    at Object.Module._extensions..js (internal / modules / cjs / loader.js: 699: 10)
    at Module.load (internal / modules / cjs / loader.js: 598: 32)
    at tryModuleLoad (internal / modules / cjs / loader.js: 537: 12)
    at Function.Module._load (internal / modules / cjs / loader.js: 529: 3)
    at Module.require (internal / modules / cjs / loader.js: 636: 17)
    at require (internal / modules / cjs / helpers.js: 20: 18)
    at aliasce-app-analyticals-panel \ app \ backend \ src \ start.js: 1: 78)
    at Module._compile (internal / modules / cjs / loader.js: 688: 30)
    at Object.Module._extensions..js (internal / modules / cjs / loader.js: 699: 10)
    at Module.load (internal / modules / cjs / loader.js: 598: 32)
[nodemon] app crashed - waiting for file changes before starting ...

如果我在 C:\Users\username\Documents\DEVELOPMENT\NEORIS\ ALIANSCE\aliansce-app-analyticals-panel\app\ ackend\src directory 中运行 nodemon 它有效!

【问题讨论】:

    标签: node.js express environment-variables


    【解决方案1】:

    我看了这行代码——https://github.com/rolodato/dotenv-safe/blob/master/index.js#L27

    它试图读取文件.env.example但在当前文件夹中找不到它(运行pwd检查它)

    这可能是解决问题的 3 种方法

    1) 运行

    cd app/backend/src
    nodemon start.js
    

    2)将文件.env.env.example移动到父文件夹(aliansce-app-analyticals-panel)然后运行nodemon app/backend/src/start.js

    3) 根本不要使用dotenv-safe。像这样使用你自己的简单脚本

    看看这个简单的例子:

    【讨论】:

    • 感谢@OlegDovger,在 ../src 目录中运行 nodemon 时,它运行正常,但是在 package.json 来自错误的主目录中运行 nodemon 时,无法访问该进程.env 为什么会这样?
    • 感谢您推荐此 Oleg!我已经设法使用您的代码来解决这个问题 - 下面的示例。
    【解决方案2】:

    在@OlegDoveryargs 的帮助下,我设法从不同的路径传递.env 文件,并在开发过程中使用nodemon 进行热重载。

    例如$ nodemon --watch /path/to/.env server.js --envPath=path/to/.env 将获取 .env 文件的更改并重新启动部署。

    示例代码

    .env

    EXAMPLE_HOST=myhost
    EXAMPLE_PORT=5566
    

    env.js

    /*
     * Module dependencies
     */
    
    const fs = require("fs");
    const yargs = require("yargs");
    
    /*
     * Custom class to update process.env from custom filepath
     * Ref: https://github.com/olegdovger/pizza-delivery-api/blob/master/lib/env.js
     */
    
    class Env {
      constructor(envPath) {
        this.variables = [];
        this._setup(envPath);
      }
    
      _setup(envPath) {
        try {
          const data = fs.readFileSync(envPath, {
            encoding: "utf-8",
          });
          const stringArray = data.split("\n");
          this.variables = stringArray.map((string) => {
            const arr = string.split("=");
            return {
              name: arr[0],
              value: arr[1],
            };
          });
        } catch (err) {
          console.error("Unable to load .env;", err);
        }
      }
    
      load() {
        this.variables.forEach((variable) => {
          process.env[variable.name] = variable.value;
        });
      }
    }
    
    /*
     * Load .env from argv filepath
     */
    const argv = yargs.argv;
    new Env(argv["envPath"]).load();
    
    /**
     * Register
     */
    module.exports = {
      EXAMPLE_HOST: process.env.EXAMPLE_HOST || "localhost",
      EXAMPLE_PORT: Number(process.env.EXAMPLE_PORT) || 12345,
    };
    
    

    server.js

    const { EXAMPLE_HOST, EXAMPLE_PORT } = require("./env");
    

    然后可以在项目中加载/使用环境变量,如果它们未在 .env 文件中定义,则具有备用值。

    即如果EXAMPLE_HOST 不存在于.env 中,则此值将默认为localhost

    【讨论】:

      猜你喜欢
      • 2017-10-05
      • 2012-05-20
      • 2013-12-10
      • 1970-01-01
      • 2011-10-05
      • 2020-04-26
      • 1970-01-01
      • 2018-01-04
      • 1970-01-01
      相关资源
      最近更新 更多