【问题标题】:Mongoose - Code Outside of Query Executed FirstMongoose - 首先执行查询之外的代码
【发布时间】:2022-02-07 05:39:25
【问题描述】:

我正在使用 Node JS 并向我的 MongoDB 服务器发出请求。问题是我的 Data.findOne() 之外的 2 个控制台日志似乎在查询内容之前执行。

Data.findOne({_id: "---"}, (err, docs) => {
    item1 = docs.projects[1]
    item2 = docs.projects[2]
    console.log(item1)
    console.log(item2)
})
console.log(item1)
console.log(item2)

这导致我的代码稍后出现错误,因为它试图访问 item1 和 item2 中的内容,但它们未定义。不是对象是否真实存在的问题,因为函数内部的日志返回对象,只是函数的内容执行的时间不对。

【问题讨论】:

    标签: node.js mongodb


    【解决方案1】:

    您可以使用 promise 样式而不是回调样式。

    const SomeFunction = async() => {
     try {
        const docs = await Data.findOne({_id: "---"}).lean()
        const item1 = docs.projects[1]
        const item2 = docs.projects[2]
        console.log(item1)
        console.log(item2)
     } catch(err) {
          console.log(error)
     }
    }
    

    奖金:Faster Query with lean()

    【讨论】:

    • 我尝试通过复制该函数然后使用SomeFunction() 直接调用它来实现你所做的,但是当我使用console.log(item1); console.log(item2) 跟随它时,它似乎仍然在函数之外执行日志,然后是里面的日志。我知道这是因为它记录了 2 个空对象(来自外部的控制台日志),然后记录了 2 个带有数据的对象(函数内部的 2 个控制台日志)
    • 你必须使用等待/异步。 await 表示等待承诺返回。注意我有awaitinfront fo 这个词。 Data.findOne。当你调用SomeFunction 时,你需要使用await SomeFunction()。如果不使用await,那么2console.log会在promise返回之前执行。
    猜你喜欢
    • 2018-12-16
    • 1970-01-01
    • 1970-01-01
    • 2022-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    相关资源
    最近更新 更多