如何同步ES6导入

问题描述 投票:0回答:2

由于 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 的连接。你有解决办法吗?

node.js es6-modules
2个回答
0
投票

您可以在您希望导入发生的行中使用顶级等待和

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")

0
投票

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 的更深入的示例:

希望这对某人有益:)

© www.soinside.com 2019 - 2024. All rights reserved.