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"); } }); });