Измените записи mongodb перед отправкой ответа api

#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