Возвращаемое значение в функции - PullRequest
0 голосов
/ 01 декабря 2019

У меня есть следующая функция:

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 (), что неверно.

Любая помощь будет принята с благодарностью.

1 Ответ

2 голосов
/ 01 декабря 2019

Вы очень близки, но есть одна вещь, которую вы упускаете из-за вашей функции 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
    }
}
...