Проблема в том, что вы пытаетесь отправить ответ JSON при каждом обратном вызове обновления базы данных.Вы можете отправить ответ только один раз на запрос.Вы можете либо использовать Promise.all
, чтобы дождаться обновления запаса и продуктов, либо использовать функцию Mongoose bulkWrite .
bulkWrite
более эффективна, поскольку включает толькоодин запрос к БД, а не несколько.
Вот (непроверенный) пример того, как bulkWrite может работать с вашим кодом:
router.put('/stockAccepted/:id', (req, res, next) => {
stockSchema.findOneAndUpdate({
_id: req.params.id
}, {
$set: {
stockAccepted: req.body.stockAccepted
}
}).then((result) => {
let stockItem = req.body.stockItem;
let updates = []
stockItem.forEach((element) => {
updates.push({
updateOne: {
filter: {
_id: element.productId
},
update: {
$inc: {
productQuantity: element.productQuantity
}
}
}
})
})
return productSchema.bulkWrite(updates)
}).then((result) => {
res.json(result);
}).catch((err) => {
res.json(err);
})
});
Я использую обещание, возвращенное из БДзвоните в mongoose, а не в обратные вызовы, так как это уменьшает вложенность.
В отличие от вашей версии, этот код будет ожидать обновления запасов в БД.Затем он создаст массовую операцию и отправит ее в БД.Как только это будет выполнено, он, наконец, вернет ответ от массовой операции в виде JSON.
Обратите внимание, что обработчик окончательного улова будет обнаруживать ошибки как при обновлении, так и при массовом обновлении продукта.