首页 > 解决方案 > 在发送到 api 响应之前修改 mongodb 记录

问题描述

我使用 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.jsmongodbapiexpress

解决方案


在您的路由器处理程序中,您将执行以下操作:

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方法来更新该集合中的文档mongodbProducts

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数组返回给客户端


推荐阅读