【问题标题】:Returning value within function函数内返回值
【发布时间】:2019-12-01 06:28:35
【问题描述】:

我有以下功能:

const findUserByEmail = (email) => {
  var user
  MongoClient.connect(url, (err, db) => {
    const dbo = db.db('users')
    dbo.collection('users').findOne({email: email}, (err, result) => {
      if (err) throw err
      else return result
    })
    db.close()
  }).then((user) => {
    return user
  })
}

我正在尝试返回 user 的值,以便 findUserByEmail(email)=user 但无法弄清楚如何。我已经尝试使用 async/await 并承诺返回这个值来绕过 Node 的异步特性,但是在每个我都无法获得返回到主函数的值。在这种情况下,return user 将用户返回给 then() 函数,这是不正确的。

任何帮助将不胜感激。

【问题讨论】:

    标签: node.js mongodb asynchronous


    【解决方案1】:

    您非常接近,但您的函数findUserByEmail 缺少一件事,它需要返回Promise。使用Promise,您可以在将来调用resolve,结果来自findOne。这也将改变您使用findUserByEmail 函数的方式。

    示例

    const findUserByEmail = (email) => {
        return new Promise((resolve, reject) => {
            MongoClient.connect(url, (mongoError, db) => {
                if (mongoError) {
                    return reject(mongoError)
                }
    
                const dbo = db.db('users')
    
                dbo.collection('users').findOne({ email: email }, (findError, user) => {
                    if (findError) {
                        return reject(findError)
                    }
    
                    db.close();
    
                    return resolve(user)
                })
            })
        })
    }
    

    要使用此功能,您可以使用Promise.then(user => ) 或使用async/await 的首选方法。

    使用.then()消费

    findUserByEmail("email.com").then(user => {
        // do something
    }).catch(err => {
        // do something
    })
    

    使用async/await消费

    async function test() {
        try {
            const user = await findUserByEmail("email.com");
            // do something
        } catch (error) {
            // do something
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-01
      • 1970-01-01
      • 2021-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-09
      相关资源
      最近更新 更多