Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 在发送到api响应之前修改mongodb记录_Node.js_Mongodb_Api_Express - Fatal编程技术网

Node.js 在发送到api响应之前修改mongodb记录

Node.js 在发送到api响应之前修改mongodb记录,node.js,mongodb,api,express,Node.js,Mongodb,Api,Express,我使用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.

我使用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中的新手。在您的路由器处理程序中,您可以执行以下操作:

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);
    });
使用
mongodb
Products
集合中的
findOneAndUpdate
方法更新该集合中的文档

findOneAndUpdate
将三个对象作为参数:

  • 第一个指定查询条件
  • 第二个指定更新的文档
    • 这里我们使用
      $set
      操作符将
      图像
      属性添加到现有文档中
  • 第三个是
    options
    对象
    • new
      设置为true,告诉mongo返回更新的文档而不是原始文档,这是默认值
以下是文档参考,以了解更多信息:

编辑:要仅修改响应,请在
内执行。然后

.then(products => {
    const modifiedProducts = products.map(product => ({
        ...product,
        image: '/assets/images/' + product._id + '.jpg'
    }));

    return res.status(200).json(modifiedProducts);
})

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

一次返回一条记录的好解决方案,但返回多行时会发生什么情况?@SurajBharti您可以使用
.updateMany()
要更新多个记录,然后在
中使用相同的查询条件。find()
之后立即将相同的记录返回给客户端,我不想更新数据库,我只想通过API提供修改后的数据