【问题标题】:using module.exports in an unusual way [duplicate]以不寻常的方式使用 module.exports [重复]
【发布时间】:2020-05-11 17:04:54
【问题描述】:

我也想在其他模块中使用 mongodb 连接,所以我选择了这种方法。 是否有任何缺点或我应该注意的事情。 我将在我的 app.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 永远无法获得值,因此您的循环永远不会完成。你真的运行过这个吗?这将只是一个无限循环。在我们拥有与模块初始化(正在处理)一起使用的顶级 await 之前,您不能直接导出异步获得的值。相反,您可以导出一个承诺,而调用者必须使用该承诺来获取数据库。或者导出一个返回承诺的函数。
  • 那是因为当我在其他模块中使用连接时我不希望 null 。当我在 app.js 中需要这个模块时,我会确保我的连接已打开
  • 我猜@jfriend00 是对的,我会阻止事件循环,db 永远不会得到它的价值

标签: node.js mongodb node-modules


【解决方案1】:

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

首先,您的 while(true) 循环会阻塞事件循环,因此 db 永远无法获得值,因此您的循环永远不会完成。

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

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

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

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

在这些其他答案中有关忙等待 while 循环问题的更多信息:

Wait until flag=true

javascript - What is wrong with this while loop? never ending loop

Why does a while loop block the event loop?

【讨论】:

  • 我知道这会阻塞事件循环,然后调用将永远不会被事件循环执行。你能分享任何使用异步等待的资源或代码吗?
  • 下面的代码是正确的方式
  • db = null ; module.exports = client.connect().then(()=>{ db = client.db("mydb"); db.collection("users").createIndex({ mobno: 1 }, { sparse: true,唯一的:true }); return db ; }).catch((error)=>{ db = error; });
  • @NamitPiriya - async/await 在这里帮不了你。没有办法直接导出异步检索的值。您必须导出调用者可以用来获取值的承诺,否则调用者必须注册回调。在分配module.exports 并且模块完成加载之后,数据库在未来很长一段时间内完成了它的连接。未来有一个针对顶级 await 以及异步模块加载的 nodejs 提案,但我们还没有。
猜你喜欢
  • 2023-03-11
  • 2015-10-29
  • 2021-05-28
  • 1970-01-01
  • 2012-06-21
  • 1970-01-01
  • 2013-01-09
  • 2018-09-09
  • 1970-01-01
相关资源
最近更新 更多