#node.js #mongodb #api #express
#node.js #mongodb #API #выражать #выразить
Вопрос:
Я использую MongoDB в качестве базы данных и express.js для создания API. Я хочу изменить ответ перед отправкой его клиенту. вот мой express.js код…
products.route("/:id")
.get((req, res) => {
mdb.get().collection('products').find({_id:parseInt(req.params.id), status:1}).toArray()
.then(response => res.status(200).json(response))
.catch(error => console.error(error));
})
Например, я хочу добавить некоторые вычисленные файлы в ответ. предположим, что мой объект ответа из базы данных является следующим
response = {
id: 1001,
name: 'Apple',
price: 120
}
Теперь я хочу добавить поле изображения. итак, мой окончательный объект ответа будет
response = {
id: 1001,
name: 'Apple',
price: 120,
image: '/assets/images/' id '.jpg'
}
Пожалуйста, помогите мне с этим, я очень новичок в express.js
Ответ №1:
Внутри вашего обработчика маршрутизатора вы могли бы сделать что-то вроде этого:
Products
.findOneAndUpdate({ _id: req.params._id, status: 1 }, {
$set: {
images: '/assets/images/' req.params._id '.jpg'
}
},{
new: true
})
.then(product => {
if(!product) return res.status(404).json("Product not found");
else return res.status(200).json(products);
})
.catch(err => {
console.error(err);
return res.status(500).json(err);
});
Используйте findOneAndUpdate
метод из mongodb
вашей Products
коллекции, чтобы обновить документ внутри этой коллекции.
findOneAndUpdate
принимает три объекта в качестве параметров:
- первый определяет условие запроса
- второй указывает обновленный документ
- Здесь мы используем
$set
оператор для добавленияimage
свойства к существующему документу.
- Здесь мы используем
- третий — это
options
объект- установите
new
значение true, чтобы сообщить mongo о возврате обновленного документа вместо исходного, который используется по умолчанию
- установите
Вот ссылка на документы для получения дополнительной информации:https://docs.mongodb.com/manual/reference/method/db.collection.findOneAndUpdate /
РЕДАКТИРОВАТЬ: Чтобы изменить только ответ, вы должны сделать внутри .then
:
.then(products => {
const modifiedProducts = products.map(product => ({
...product,
image: '/assets/images/' product._id '.jpg'
}));
return res.status(200).json(modifiedProducts);
})
Здесь мы создаем новый объект для каждого возвращаемого продукта, копируя его исходное содержимое плюс новое свойство image, а затем возвращаем этот modifiedProducts
массив клиенту
Комментарии:
1. Хорошее решение для одного возврата одной записи, но что при возврате нескольких строк?
2. @SurajBharti вы могли бы использовать
.updateMany()
для обновления нескольких записей, а затем использовать одно и то же условие запроса в.find()
сразу после этого, чтобы вернуть те же записи клиенту,3. Я не хочу обновлять свою базу данных, я просто хочу предоставить измененные данные через API