使用Node.js,如果除app.js之外的其他文件中未包含它,为什么dotenv会触发错误?

问题描述

环境:Node.js,Dotenv

通常仅在主文件(例如app.js)中需要

require('dotenv').config()。这样一来,process.env就可以在应用程序的每个文件中被引用。这个答案与https://stackoverflow.com/a/58697426/12582054

相同

但是,我只是遇到一个实例,如果我没有在附加文件中包含require('dotenv').config(),并且我不确定为什么,则会出错。

简化示例:

app.js

const path = require('path');

// Custom path to .env file.
require('dotenv').config({ path: path.join(__dirname,'/models/.env')});

const middlewareFile = require('./controllers/middleware-file');

middleware-file.js

const usps = require('usps-webtools-promise').default;

const usps = new usps({
    userId: process.env.usps_USER_ID,properCase: Boolean
});

usps-webtools-promise似乎是引发错误的模块。

如果我在middleware-file.js的顶部未包含dotenv引用,则usps模块将引发错误。它正好指向值process.env.usps_USER_ID的第一个字母。

抛出新错误_1.default(“必须通过usps用户ID”);

uspsError [usps Webtools错误]:必须传递usps userId

at Object。 (c:\ website \ controllers \ middleware-file.js:35:14)

我可以通过在文件顶部添加dotenv来解决错误

const path = require('path');
require('dotenv').config({ path: path.join(__dirname,'../models/.env')});

解决方法

请确保致电require('dotenv').config({ path: path.join(__dirname,'../models/.env')}); as early as possible in your application。此外,您可以使用以下命令记录结果或检查错误:

const dotenv = require('dotenv').config({ path: path.join(__dirname,'/models/.env')});

if (dotenv.error) {
  // Something went wrong
  console.error(dotenv.error);
} else {
  // Log parsed values
  console.log(dotenv.parsed);
}