簡體   English   中英

NodeJs & Express Learning RESTFUL,在提交要更新的表單時,它會創建一個帶有 new._id 的新表單,而不是更新原始表單

[英]NodeJs & Express Learning RESTFUL, when submitting form to update, it creates a new form with a new ._id instead of updating the original one

我正在學習如何使用快速服務器和 RESTFUL 路由。 目前我無法更新我的博客文章,當我在我的編輯頁面上點擊提交時,它會將我帶到未編輯的原始帖子但是當我 go 到索引頁面時,原始帖子沒有改變,並且有一個重復的帖子我使用 new._id 進行的編輯。 我在本地環境中運行它。 數據庫是 Mongodb 使用 Mongoose。

 //app.js file const express = require('express'), app = express(), bodyParser = require('body-parser'), mongoose = require('mongoose'), port = 3000; const methodOverride = require('method-override'); ////APP CONFIG app.set('view engine', 'ejs'); app.use(express.static('public')); app.use(bodyParser.urlencoded({ extended: true })); app.use(methodOverride("_method")); mongoose.connect('mongodb://localhost:27017/restful_blog', { useNewUrlParser: true, useUnifiedTopology: true, useCreateIndex: true, useFindAndModify: false }); ////MONGOOSE/MODEL/CONFIG const blogSchema = new mongoose.Schema({ title: String, image: String, body: String, created: { type: Date, default: Date.now } }); const Blog = mongoose.model('Blog', blogSchema); ////RESTFUL ROUTES app.get('/', (req, res) => { res.redirect('/blogs'); }); //Index Route app.get('/blogs', (req, res) => { Blog.find({}, (err, blogs) => { if (err) { console.log(err); } else { res.render('index', { blogs: blogs }); } }); }); //New Route app.get('/blogs/new', (req, res) => { res.render('new'); }); //Create Route app.post('/blogs', (req, res) => { //Create Blog Blog.create(req.body.blog, (err, newBlog) => { if (err) { res.render('new'); } else { //Then, Redirect to Index res.redirect('/blogs'); } }); }); //Show Route app.get('/blogs/:id', (req, res) => { Blog.findById(req.params.id, (err, foundBlog) => { if (err) { res.redirect('/blogs'); } else { res.render('show', { blog: foundBlog }); } }); }); //Edit Route app.get('/blogs/:id/edit', (req, res) => { Blog.findById(req.params.id, (err, foundBlog) => { if (err) { res.redirect('/blogs'); } else { res.render('edit', { blog: foundBlog }); } }); }); //Update Route app.put('/blogs/:id', (req, res) => { Blog.findOneAndUpdate(req.body.id, req.body.blog, (err, updatedBlog) => { if (err) { res.redirect('/blogs'); } else { res.redirect('/blogs/' + req.params.id); } }); }); ////Starts Server app.listen(port, () => console.log( `YelpCamp is running at http://localhost:${port}` ));

 //edit.js file <%- include('partials/header') %> <div class="ui main text container segment"> <div class="ui huge header"> Edit <%= blog.title %> </div> <form class='ui form' method="POST" action="/blogs/<%= blog._id %>?_method=PUT" > <div class="field"> <label>Title</label> <input class="ui input" type="text" name="blog[title]" value="<%= blog.title %>"> </div> <div class="field"> <label>Image</label> <input class="ui input" type="text" name="blog[image]" value='<%= blog.image %>'> </div><div class="field"> <label>Blog Post</label> <textarea name="blog[body]"><%= blog.body %></textarea> </div> <input class='ui basic button red big' type="submit"> </form> </div> <%- include('partials/footer') %>

我認為問題出在更新路線上,您正在使用findOneAndUpdate並僅將id傳遞給它,而您應該將object作為過濾器傳遞給它

另外, idparams object 中,不在正文中,所以我們必須使用req.params.id而不是req.body.id

所以你有兩個選擇來解決這個問題我猜

1-使用findOneAndUpdate ,但傳遞一個 object 作為過濾器

//Update Route
app.put('/blogs/:id', (req, res) => {
  Blog.findOneAndUpdate({ _id: req.params.id }, req.body.blog, (err, updatedBlog) => {
    if (err) {
      res.redirect('/blogs');
    } else {
      res.redirect('/blogs/' + req.params.id);
    }
  });
});

2-或者使用findByIdAndUpdate ,這里可以直接傳id

//Update Route
app.put('/blogs/:id', (req, res) => {
  Blog.findByIdAndUpdate(req.params.id, req.body.blog, (err, updatedBlog) => {
    if (err) {
      res.redirect('/blogs');
    } else {
      res.redirect('/blogs/' + req.params.id);
    }
  });
});

希望能幫助到你

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM