由于 ES6 中的模块,我必须将整个应用程序迁移到 ES6。
现在,因为导入是异步的,所以我的代码流程出现了问题。
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 import('./services/mongoose.service.js');
来实现此目的,但我建议改为正确声明猫鼬服务对加载配置的依赖关系:
// 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")
Bergi 的接受的答案是处理此用例(顶级等待)的方法,尽管我将这个答案留在这里供任何寻找同步方法的人:)。
关于您关于“如何同步 ES6 导入”的原始问题,在 2023 年,我写了 import-sync 这可以帮助满足此要求:
该库是 esm 的包装器,支持将 CJS/ESM 导入到 ES6 和基于 CJS 的 NodeJS 项目中。
例如,而不是
const someModule = await import(`./${filePath}`);
我们可以将其重写为:
// const importSync = require('import-sync');
import importSync from 'import-sync';
const someModule = importSync(`./${filePath}`);
这是一个涉及 mongoose 的更深入的示例:
希望这对某人有益:)