带有ES6导入的Nodejs

时间:2019-08-04 11:21:17

标签: node.js

这是我的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);

2 个答案:

答案 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()