Как использовать async-await в findOneAndUpdate

#javascript #node.js #async-await

#javascript #node.js #async-await

Вопрос:

я попробовал следующий код, чтобы — найти имя и заменить его другим именем в базе данных, а также подсчитать и распечатать количество документов, возраст которых составляет 30 лет

 const findAndUpdate = async (name, age) => {
    const user = await User.findOneAndUpdate({name})
    const count = await User.countDocuments({age})
    return count
}

findAndUpdate('oldName', 'newName', 30).then(count => {
    console.log(count)
}).catch(e => {
    console.log(e)
})
  

Комментарии:

1. Ваша функция принимает два параметра, ‘name’ и ‘age’, но вы вызываете ее с тремя параметрами…

2. ПРИВЕТ, сэр, в базе данных ‘name:’ старое имя необходимо заменить на новое one.so какой аргумент мне следует использовать??async (имя, name, age) возвращает дублирование ошибки

Ответ №1:

Похоже, вы не предоставляете новое имя для User.findOneAndUpdate() . Вы могли бы исправить это следующим образом:

 const findAndUpdate = async (oldName, newName, age) => {
    const user = await User.findOneAndUpdate({name: oldName}, {name: newName})
    const count = await User.countDocuments({age})
    return count
}

findAndUpdate('oldName', 'newName', 30).then(count => {
    console.log(count)
}).catch(e => {
    console.log(e)
})
  

Комментарии:

1. Уже сделано, показывая «Спасибо за отзыв! Голоса, поданные теми, у кого репутация менее 15, записываются, но не изменяют публично отображаемую оценку публикации. »

Ответ №2:

Вы используете его нормально. Async / await работает следующим образом. У вас есть функция, которая выполняет задачу, но вы не хотите ждать, пока она завершит задачу, прежде чем она сможет продолжить другую задачу.

Затем вы используете оператор async, чтобы показать, что это асинхронная функция, затем вы используете await, когда хотите выполнить задачу, которая возвращает данные, чтобы она не блокировала другие задачи.

Комментарии:

1. показывает причину ошибки: Ошибка утверждения [ERR_ASSERTION]: выражение, оцененное в ложное значение: assert.ok(!isNaN(val))

Ответ №3:

проблема в том, что вы вызываете, findAndUpdate ожидая, что он вернет обещание, если вы хотите использовать .then для получения количества, ваша функция должна вернуть обещание

 const findAndUpdate = (name, age) => {
    return new Promise(async (resolve, reject) => {
        try {
            const user = await User.findOneAndUpdate(...)
            const count = await User.countDocuments(...)
            resolve(count)
        } catch (err) {
            reject(err)
        }
    })
}
findAndUpdate(...).then(count => {
    console.log(count)
}).catch(e => {
    console.log(e)
})
  

Комментарии:

1. здесь я могу вставить старое имя и новое имя для замены

2. я предполагаю, что вы используете mongoose?

3. Объявление функции async заставляет ее возвращать обещание.