Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 函数中的返回值_Node.js_Mongodb_Asynchronous - Fatal编程技术网

Node.js 函数中的返回值

Node.js 函数中的返回值,node.js,mongodb,asynchronous,Node.js,Mongodb,Asynchronous,我有以下功能: 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 retur

我有以下功能:

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,并承诺返回此值以绕过节点的异步性质,但在每种情况下,我都无法获得返回到主函数的值。在本例中,return user将用户返回到then()函数,这是不正确的


任何帮助都将不胜感激。

您的关系非常密切,但您的功能
FindUserByMail
缺少一点,它需要返回一个
承诺。使用
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 function test() {
    try {
        const user = await findUserByEmail("email.com");
        // do something
    } catch (error) {
        // do something
    }
}
使用
async/await

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

非常接近,但函数
findUserByEmail
缺少一点,它需要返回一个
承诺。使用
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 function test() {
    try {
        const user = await findUserByEmail("email.com");
        // do something
    } catch (error) {
        // do something
    }
}
使用
async/await

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