【发布时间】:2012-05-23 22:41:30
【问题描述】:
我有一个接受 DELETE 请求的路由,我知道使用 Express 你可以添加
<input type="hidden" name="_method" value="delete" />
到一个向 url 发送 POST 请求的表单。
但是,您将如何使用链接而不是表单来做到这一点?
【问题讨论】:
标签: javascript http node.js rest express
我有一个接受 DELETE 请求的路由,我知道使用 Express 你可以添加
<input type="hidden" name="_method" value="delete" />
到一个向 url 发送 POST 请求的表单。
但是,您将如何使用链接而不是表单来做到这一点?
【问题讨论】:
标签: javascript http node.js rest express
GET 请求不支持此功能:
methodOverride() 仅检查 req.body(POST 参数)和请求标头 - 两者都不能设置为常规链接(您可以但是在 AJAX 请求中设置自定义标头,即使它们使用 GET) .
这是有道理的,否则即使使用 CSRF 令牌也可能是一个主要问题。您永远无法知道浏览器何时会决定预取链接 - 因此 GET 请求应该永远执行诸如删除之类的操作。
如果你真的需要它并且不关心它的缺点,可以考虑编写一个自定义函数:
function methodOverrideGET(key) {
key = key || "_method";
return function methodOverrideGET(req, res, next) {
if (req.originalMethod != req.method) {
// already overridden => do not override again
next();
return;
}
req.originalMethod = req.method;
if (req.query && key in req.query) {
req.method = req.query[key].toUpperCase();
delete req.query[key];
}
next();
};
};
现在您可以在.use(methodOverrideGET) 之后 .use(methodOverride) 然后简单地将_method=DELETE 添加到查询字符串中。
【讨论】:
methodOverride。我打算用它来删除会话,所以我认为安全隐患没有那么大?
methodOverride 中间件中明确检查删除会话的路由,以便有人不会将查询字符串参数注入另一个 DELETE 路由的 url,并尝试做一些时髦的 CSRF 攻击