这是我的index.js
:
import dotenv from 'dotenv'
dotenv.config();
import "./WebScrapingProject/DBConnect";
如果运行上面的代码,则会出现此错误:
The `uri` parameter to `openUri()` must be a string, got "undefined".
但是如果我将导入更改为ES5:
import dotenv from 'dotenv'
dotenv.config();
require("./WebScrapingProject/DBConnect");
它有效,但是为什么呢?以及在这种情况下如何使用ES6导入?
这是DBConnect
文件:
import {default as mongo} from "mongoose";
mongo.connect(process.env.DB_HOST, {useNewUrlParser: true}).then(() => {console.log('DB connected!')});
mongo.set('useFindAndModify', false);
答案 0 :(得分:2)
问题在于导入是在dotenv
加载环境配置文件之前发生的。这是因为所有导入都在运行文件中的其他代码之前加载。
解决此问题的一种方法是将env配置放在一个单独的文件中,然后先导入。
例如
// index.js
import './loadEnv';
import './WebScrapingProject/DBConnect';
// loadEnv.js
import dotenv from 'dotenv';
dotenv.config()
答案 1 :(得分:2)
在哪种模块系统上可以使用两种不同的选择:
使用require
导入模块也 CommonJS
使用 ES6 import
导入模块。
当您执行require
时,两个模块系统的行为是不同的
加载是同步。这意味着,如果您有多个需求,它们将被一个接一个地加载和处理。
并且import
可以是异步的(在当前的ES6 Module Loader中,实际上是这样)并且可以表现得更好。
在您的情况下,mongoose
尚未获得配置设置,这就是由于尚未加载哪个配置文件而引发错误的原因
问题是导入发生在dotenv加载您的env配置文件之前。
解决方案是将 env配置放在单独的文件中,然后先导入或更改顺序
// index.js
import './loadEnv';
import './WebScrapingProject/DBConnect';
// loadEnv.js
import dotenv from 'dotenv';
dotenv.config()