Mongoose findByIdAndUpdate没有更新数据

似乎无法看到为什么findByIdAndUpdate没有更新数据。 我改变它findByIdAndRemove,看看我能否发现错误,但当我改变它,它确实删除,所以我不能追查到这个问题。 提前感谢您的帮助。

这是路线

router.get("/:id/edit", function(req, res){ Product.findById(req.params.id, function(err, foundProduct){ res.render("admin/edit",{product: foundProduct}); }); }); router.put("/:id",function(req, res){ Product.findByIdAndUpdate(req.params.id, req.body.product, function(err, updatedProduct){ if(err){ res.redirect("/"); }else{ res.redirect("/admin/inventory"); } }); }); 

这里是button来编辑表单:

 <h2>This is the inventory page!</h2> <% include ../partials/header%> <a href="/admin/new">Add a new product</a> <div class = "row"> <% products.forEach(function(product){ %> <div class = "col-sm-6 col-md-4"> <div class = "thumbnail"> <img src = <%=product.imagePath%> alt = "..." class = "img-responsive"> <div class = "caption"> <h3><%=product.title%> </h3> <p class = "description"> <%=product.description%> </p> <div class = "clearfix"> <div class = "price pull-left">$<%=product.price%> </div><br><br> <a href = "/admin/<%=product._id%>/edit"class = "btn btn-info pull-right" role = "button" > Edit</a> <form id="delete-form" action="/admin/<%= product._id %>?_method=DELETE" method="POST"> <button class="btn btn-danger">Delete</button> </form> </div> </div> </div> </div> <% }); %> </div> <% include ../partials/footer%> 

这是编辑表单:

 <% include ../partials/header %> <h2>This is the inventory edit page</h2> <div class="container"> <div class="row"> <h1 style="text-align: center">Edit</h1> <div style="width: 30%; margin:25px auto"> <form action="/admin/<%=product._id%>?_method=PUT" method="POST"> <div class="form-group"> <input class="form-control" type="text" name="product[title]" value="<%=product.title%>"> </div> <div class="form-group"> <input class="form-control" type="text" name="product[imagePath]" value="<%=product.imagePath%>"> </div> <div class="form-group"> <input class="form-control" type="text" name="product[description]" value="<%=product.description%>"> </div> <div class="form-group"> <input class="form-control" type="text" name="product[price]" value="<%=product.price%>"> </div> <div class="form-group"> <button class="btn btn-lg btn-primary btn-block">Submit!</button> </div> </form> <a href="/">Go Back</a> </div> </div> </div> <% include ../partials/footer %> 

以下是产品型号:

 var mongoose = require('mongoose'); module.exports = mongoose.model('Product',{ imagePath: {type: String, required: true}, title: {type: String, required: true}, description: {type: String, required: true}, price: {type: Number, required: true} }); 

您的表单正在使用“扩展格式”参数名称:

 <input class="form-control" type="text" name="product[title]" ...> 

但是,如果在body-parser禁用扩展格式parsing,则req.body的结果值将会出错:

 { 'product[title]' : 'value' } 

(而不是{ product : { title : 'value' } }

您应该启用扩展格式parsing:

 app.use(bodyParser.urlencoded({ extended : true })); 

文档: https : //github.com/expressjs/body-parser#extended

也许问题在这里:

 router.put("/:id",function(req, res){ Product.findByIdAndUpdate(req.params.id, req.body.product, function(err, updatedProduct){ if(err){ res.redirect("/"); }else{ res.redirect("/admin/inventory"); } }); }); 

将其更改为:

 router.put("/:id",function(req, res){ Product.findByIdAndUpdate(req.params.id, { imagePath: req.body.imagePath, ..... }, function(err, updatedProduct){ if(err){ res.redirect("/"); }else{ res.redirect("/admin/inventory"); } }); });