以不寻常的方式使用 module.exports



我也想在其他模块中使用mongodb连接,所以我选择了这种方法。 是否有任何缺点或我应该注意的事情。 我将在我的应用程序中需要此文件.js文件。 或者有没有其他优雅的方式来做同样的事情.

const uri = "mongodb://localhost";
const MongoClient = require('mongodb').MongoClient;
const client = new MongoClient(uri, { useNewUrlParser: true });
db = null ;
client.connect().then(()=>{
db = client.db("mydb");
db.collection("users").createIndex({ mobno: 1 }, { sparse: true, unique: true });
}).catch((error)=>{
db = error;
});
while(true){
if (db!=null){
module.exports = db;
break;
}
}

这有很多问题。这个概念行不通。

对于初学者来说,while(true)循环会阻塞事件循环,因此db永远无法获得值,因此您的循环永远不会完成。

当连接中的网络操作完成时,它将向事件队列添加一个事件,并且与其关联的回调(然后是解析的承诺(只能在将控制权返回到事件循环以便处理该事件时运行。

但是,while(true)循环会阻塞事件循环,因此无法处理任何事件。 除非您在循环中使用await(允许其他事件运行(,否则您不能在 node.js 中使用这样的等待循环。 它只是创造了一个无限循环。

在我们拥有使用模块初始化(正在处理(的顶级await之前,您无法直接导出异步获取的值。

相反,您可以导出承诺,调用方必须使用该承诺来获取数据库。或者导出返回 promise 的函数。

有关 busy-wait while 循环问题的更多信息,请参阅以下其他答案:

等到标志=真

javascript - 这个while循环有什么问题? 永无止境的循环

为什么 while 循环会阻塞事件循环?

最新更新