为什么 findOneAndUpdate 没有在数据库中更新?

why is findOneAndUpdate not updating in the DB?

我正在使用 mern 堆栈创建一个项目。我正在尝试将一个项目从我的前端更新到我的后端。当我更新它时它会 return 成功但是当我检查数据库时没有任何更新?我正在尝试使用在前端输入的 prodID 更新产品

这是我的post路线

router.post("/updateStock", (req, res) => {
    const prodID = req.body.prodID

    const product = new Product(req.body)

    Product.findOneAndUpdate(prodID, { new: true }, {returnOriginal: false}, function(err, products) {
        if (err) {
          console.log("err", err);
          res.status(500).send(err);
        } else {
          console.log("success");
          res.send(product);
        }
    });

});

这是我的架构

const mongoose = require("mongoose");

const Product = mongoose.model(
  "Product",
  new mongoose.Schema({
    title: String,
    manufacturer: String,
    price: String,
    catergory: String,
    quantity: String,
    prodID: String, 
    images: Array
  })
);

module.exports = Product;

您没有将新更新的正文传递给 findOneAndUpdatefindOneAndUpdate 期待 db.collection.findOneAndUpdate( filter, update, options )。代码应该是这样的:-

    router.post("/updateStock", (req, res) => {

    const product = new Product(req.body);
    const filter = {prodID: req.body.prodID}

    Product.findOneAndUpdate(filter, product, { new: true, returnOriginal: false}, function(err, products) {
        if (err) {
          console.log("err", err);
          res.status(500).send(err);
        } else {
          console.log("success");
          res.send(product);
        }
    });

遵循此架构 =>

db.collection.findOneAndUpdate(filter, update, options)

传递更新对象

正在关注 Mongoose 文档 here

第一名:

您将过滤器添加为字符串,但它应该是如下所示的对象

const filter = {prodID: req.body.prodID}

第二名:

无需实例化 Product 模式,使用更新对象

const update = req.body

第三: 您使用了相同的选项,也 new:true 代替了更新对象

returnOriginal: false is equivalent to new: true

第四名:

使用 promise 而不是回调,但是您调用 products 并发送 product

的回调中有错字
Product.findOneAndUpdate(filter, update, {new: true}).then((product) => {
      console.log("success");
      res.send(product);
}).catch(err => {
     console.log("err", err);
     res.status(500).send(err);
})