NodeJs & Express Изучая RESTFUL, при отправке формы для обновления она создает новую форму с новым ._id вместо обновления оригинальной - PullRequest
0 голосов
/ 26 апреля 2020

Я учусь использовать express сервер и RESTFUL маршруты. В настоящее время я не могу обновить свое сообщение в блоге, когда я нажимаю кнопку «Отправить» на странице редактирования, я перехожу к исходному сообщению, которое не редактируется, но когда я go перехожу на главную страницу, исходное сообщение не изменяется и появляется повторяющееся сообщение. с изменениями, которые я сделал с новым ._id. Я запускаю это в местной среде. База данных Mongodb с использованием Mon goose.

//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') %>

1 Ответ

0 голосов
/ 27 апреля 2020

Я думаю, что проблема в маршруте обновления, вы используете findOneAndUpdate и передали ему id, в то время как вы должны передать ему object в качестве фильтра

также, id находится в объекте params, а не в теле, поэтому мы должны использовать 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, здесь вы можете передать идентификатор напрямую

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

hope это помогает

...