expressJS 的方法覆盖不适用于 PUT 隐藏方法 HTML FORM

Method override for expressJS not working for PUT hidden method HTML FORM

使用 express 和 mongoose/mongo 创建待办事项应用程序。领域模型:作者有提醒。

在我的 app.js:

var bodyParser = require('body-parser')
var methodOverride = require('method-override')
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended:true}))
app.use(methodOverride('_method'))

我的表单在 views/authors/edit.hbs 中使用把手:

<h2>Edit {{name}}</h2>
<form action="/authors/{{_id}}" method="post">
  <input type="hidden" name="_method" value="put">
  <label>Name:</label>
  <input type="text" name="name">
  <input type="submit">
</form>

我的编辑视图路由和更新作者请求:

app.get("/authors/:id/edit", function(req, res){
  AuthorModel.findById(req.params.id, function(err, docs){
    res.render("authors/edit", docs)
  })
})

app.put("/authors/:id", function(req, res){
  console.log("updating")
  AuthorModel.findById(req.params.id, function(err, docs){
    docs.name = req.body.name
    docs.save(function(err){
      if(!err){
        res.redirect("authors/" + req.params.id)
      }
    })
  })
})

当我检查开发工具中的元素时,我看到了我需要看到的所有内容,但是当我去提交时,给我错误 CANNOT POST。创建功能工作正常,所以我的第一个想法是方法覆盖不起作用。如果我将 put 更改为 POST,一切正常。

如果有帮助,link 到包含此 app

的回购

根据文档判断,重写方法有两种常见的方式:

您正在使用 "old" 指定表单变量的方法,您仍然可以使用该方法,但这需要在服务器端 custom logic

在我看来,解决此问题的最简单方法是使用查询字符串参数:

<form action="/authors/{{_id}}?_method=put" method="post">