Express / Sequelize - PUT Route to Update Form导致500 Server Error

时间:2017-12-02 21:07:21

标签: javascript node.js express sequelize.js

我正在快递中使用put路线编辑书籍的详细信息。有三个必填字段 - 标题,作者,流派。如果我去编辑书籍的现有细节并删除其中一个字段,而不是获得续集验证错误,我会收到500服务器错误。如果我只是尝试更改必填字段的文本,它会更新数据库。这是我单独书籍的获取和放置路线。

// Get book detail + loans
router.get("/details/:id", (req, res)=> {
     const book = Book.findById(req.params.id);
     const loans = Loan.findAll({where: {book_id: req.params.id}, include: [{ model: Patron}, {model: Book}]});

     Promise.all([book, loans]).then(function(data) {

     res.render('book_detail', {book: data[0], loans: data[1]});
  });
});

/* POST update book. */
router.put("/details/:id", function(req, res, next){
  Book.findById(req.params.id).then(function(book){
    if(book) {
      return book.update(req.body);
    } else {
      res.send(404);
    }
  }).then(function(book){
    res.redirect("/books/");
  }).catch(function(error){
      if(error.name === "SequelizeValidationError") {
        var book = Book.build(req.body);
        book.id = req.params.id;
        res.render("books/details/" + book.id, {book: book, errors: error.errors})
      } else {
        throw error;
      }
  }).catch(function(error){
      res.send(500, error);
   });
});

这就是我的PUG页面的样子 - 使用方法覆盖包来调用表单字符串上的PUT:

extends layout

block content
  h1 Book: #{title}

  include error

  form(action='/books/details/' + book.id + "?_method=PUT", method="post")
    P 
      label(for='title') Book Title:
      input(id='title' name='title' width="175" type='text' value=book.title)
    p
      label(for='author') Author:
      input(id='author' name='author' type='text' value=book.author)
    p
      label(for='genre') Genre:
      input(id='genre' name='genre' type='text' value=book.genre)
    p
      label(for='genre') First Published:
      input(id='first_published' name='first_published' type='text' value=book.first_published)
    p
      input(type='submit', value='Update')

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

router.postrouter.put不同,请确保发送正确的请求。由于您从网页发送POST请求,此请求将由router.post处理,而不是router.put处理,因此此{500}错误将从router.post处抛出。由于html格式不允许使用PUT,因此您应该考虑采用另一种方式来更新您的图书。