关于node中methodOverride的
发布于 1个月前 作者 westAnHui 248 次浏览 来自 问答

为什么我无法使用put和delete方法啊 HTML表单是这么写的

  • <input name="_method" type="hidden" value="put" />

增加了这个隐藏域 node里面是这么写的

  • app.route(‘/put’)
  • .put(function(req, res, next){
  •   var index = req.body.id;
    
  •   if(info[index]){
    
  •       info[index].name = req.body.name;
    
  •       info[index].sex = req.body.sex;
    
  •   }
    
  •   ejs.renderFile(__dirname + "/view/showSingle.ejs", {aaa : info[index]}, function(err, result){
    
  •       if(!err){
    
  •           res.end(result);
    
  •       }else{
    
  •           res.end("Error");
    
  •           console.log(err);
    
  •       }
    
  •   });
    
  • });

在前面都

  • methodOverride = require(“method-override”)
  • app.use(methodOverride());

我觉得应该没问题啊。。但是就是不能用put,得到的http方法还是post。。求助怎么一回事。。

4 回复

我的用法:

// overwrite HTTP method
app.use(methodOverride(function(req, res) {
  if (req.body && typeof req.body === 'object' && '_method' in req.body) {
    var method = req.body._method
    delete req.body._method
    return method
  }
}))

@chinghanho 成功了!!万分感谢大神!!请问下method变量在这里起到的作用是什么啊?返回到哪里去了啊。。 路由判断http动词get、post、put是通过这个返回的method吗?那我没有这样写,这个method默认存在吗??

@westAnHui

method 只是暫時儲存你表單裡的 req.body._method 的方法,經過這個 middleware 後 req.body._method 就再也用不到了,所以放心 delete 掉吧!

如果去看 method-override 的原始碼,return 的 method return 到這裏去了。經過一些處理後,然後寫在 req.method 裡,後面 router 就是依這裏的 req.method 做判斷的。

我把那段 code 貼過來:

val = get(req, res)
method = Array.isArray(val)
  ? val[0]
  : val

// replace
if (method !== undefined && supports(method)) {
  req.method = method.toUpperCase()
  debug('override %s as %s', req.originalMethod, req.method)
}

@chinghanho 看懂了!!万分感谢!!!!!

回到顶部