【问题标题】:Modify mongodb records before sending to api response在发送到 api 响应之前修改 mongodb 记录
【发布时间】:2020-09-06 19:20:10
【问题描述】:

我使用 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 的新手

【问题讨论】:

    标签: node.js mongodb api express


    【解决方案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);
        });
    

    在您的 Products 集合上使用来自 mongodbfindOneAndUpdate 方法来更新该集合中的文档。

    findOneAndUpdate 以三个对象为参数:

    • 第一个指定查询条件
    • second 指定更新的文档
      • 这里我们使用$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);
    })
    

    在这里,我们为每个返回的产品创建一个新对象,方法是复制其原始内容和新的图像属性,然后将 modifiedProducts 数组返回给客户端

    【讨论】:

    • 一回一记录的好办法,但是回多行怎么办?
    • @SurajBharti 您可以使用.updateMany() 更新多条记录,然后在.find() 中使用相同的查询条件,然后将相同的记录返回给客户端,
    • 我不想更新我的数据库,我只想通过API提供修改后的数据
    猜你喜欢
    • 2017-05-03
    • 2022-11-04
    • 1970-01-01
    • 2019-09-28
    • 2020-06-11
    • 2018-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多