node.js - 将 mongodb 导出到另一个文件的模块 - 这是正确的方法?(在 nodejs 中)
问题描述
我在db.js中有这段代码:
const mongoClient = require('mongodb').MongoClient;
const dotenv = require("dotenv");
dotenv.config();
const mongoDbUrl = process.env.CONNECTIONSTRING;
mongoClient.connect(mongoDbUrl, { useNewUrlParser: true, useUnifiedTopology: true }, (err, db) => {
module.exports = db;
});
然后我想将它添加到文件User.js中
const mydb = require("../db");
console.log(mydb);
,但我得到一个空对象:
{}
使 User.js 接收 mydb 的正确代码是什么?
顺便说一句,db.js 中的控制台日志记录数据库返回我需要的内容。
解决方案
请求是同步的,而连接是异步的。它最终会在那里,但你应该做的是导出一个具有异步 init 函数的对象,然后在启动期间调用它,以确保你运行的其余代码在那之后发生。本质上,您不应“运行”模块中的任何代码,而应仅导出值。
// db.js
const mongoClient = require('mongodb').MongoClient;
const dotenv = require("dotenv");
class Db {
async init() {
dotenv.config();
const mongoDbUrl = process.env.CONNECTIONSTRING;
this.db = await mongoClient.connect(mongoDbUrl, { useNewUrlParser: true, useUnifiedTopology: true }
}
}
module.exports = new Db()
然后在您的调用代码中:
// main.js
const db = require('./db')
const app = require('./app')
async function main() {
await db.init()
await app.run()
}
main().then(() => console.log('done.')).catch(console.error)
推荐阅读
- node.js - mongoDB排序不适用于跳过和限制
- android - Completable.fromCallable 中的 Rx 错误处理
- java - 如何解决“更正应用程序的类路径,使其包含单个兼容版本”
- java - 基于带有 lambda 的嵌套列表过滤列表
- autodesk-forge - 如何使用 SceneBuilder 和 BufferGeometry 在伪造查看器中创建点?
- java - 在阶段应用程序构建android错误:mergeDebugResources,ParseError AttributeNSNotUnique
- game-physics - Bullet Physics - 关于 btHeightfieldTerrainShape 的两个问题
- javascript - 在所有选定的类 javascript 之后插入 html
- java - 如何修复数据转换错误:jdbcTemplate.update,将 Enum 写入 H2 数据库
- user-interface - 在不重新启动的情况下重新初始化 PyQt5 应用程序(用于使用 squish 进行 GUI 测试)