NodeJs & Express Learning RESTFUL,当提交表单进行更新时,它会创建一个带有新 ._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 路由。目前我无法更新我的博客 post,当我在我的编辑页面上点击提交时它会将我带到未编辑的原始 post 但是当我转到索引页面时原始 post 没有变化,并且有一个重复的 post,其中包含我使用新的 ._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 对象中而不在正文中,因此我们必须使用 req.params.id 而不是 req.body.id

所以我猜你有两种选择来解决这个问题

1- 使用 findOneAndUpdate,但传递一个对象作为过滤器

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

希望对您有所帮助