如何进行同步ES6导入



由于ES6中的一个模块,我不得不将我的整个应用程序迁移到ES6。

但是现在,由于import是异步的,我的代码流出现了问题。

index.js

import joi from 'joi';
import dotenv from 'dotenv';
const config = dotenv.config();
if (config.error) {
console.error(config.error);
process.exit(1);
}
const configError = joi.object({
HTTP_URL_FRONT: joi.string().uri().required(),
JWT_SECRET: joi.string().required(),
DIR_DATA: joi.string().required(),
DIR_TMP: joi.string().required(),
MONGODB_URI: joi.string().required()
}).required().validate(config.parsed).error;
if (configError) {
console.error(".env invalide", configError);
process.exit(1);
}
console.log("1", process.env.HTTP_URL_FRONT)
import './services/mongoose.service.js';
console.log("3", process.env.HTTP_URL_FRONT)

服务/mongoose.service.js

console.log("2", process.env.HTTP_URL_FRONT);
import mongoose from 'mongoose';
(async function () {
await mongoose.connect(process.env.MONGODB_URI);
})().catch(e => {
console.error(e);
process.exit(1);
});
export default mongoose;

结果

2 undefined
1 http://localhost
3 http://localhost
MongooseError: The `uri` parameter to `openUri()` must be a string, got "undefined". Make sure the first parameter to `mongoose.connect()` or `mongoose.createConnection()` is a string.

可以看到,之前已经完成了导入,这会中断与Mongo的连接。你有解决办法吗?

您可以在希望导入发生的行中使用顶级await和await import('./services/mongoose.service.js');来实现这一点,但我建议的是正确声明您的mongoose服务对加载配置的依赖:

// config.js
import joi from 'joi';
import dotenv from 'dotenv';
const config = dotenv.config();
if (config.error) {
throw config.error;
}
const configError = joi.object({
HTTP_URL_FRONT: joi.string().uri().required(),
JWT_SECRET: joi.string().required(),
DIR_DATA: joi.string().required(),
DIR_TMP: joi.string().required(),
MONGODB_URI: joi.string().required()
}).required().validate(config.parsed).error;
if (configError) {
throw new Error(".env invalide", {cause: configError});
}
console.log("1", config.parsed.HTTP_URL_FRONT)
export default config.parsed;
// services/mongoose.service.js
import mongoose from 'mongoose';
import config from '../config.js';
console.log("2", config.HTTP_URL_FRONT);
await mongoose.connect(config.MONGODB_URI);
export default mongoose;
// index.js
import './services/mongoose.service.js';
console.log("3: config loaded and mongoose connected")

最新更新