【问题标题】:Sending DELETE request in a link in nodejs express app在 nodejs express 应用程序的链接中发送 DELETE 请求
【发布时间】:2012-05-23 22:41:30
【问题描述】:

我有一个接受 DELETE 请求的路由,我知道使用 Express 你可以添加

 <input type="hidden" name="_method" value="delete" />

到一个向 url 发送 POST 请求的表单。

但是,您将如何使用链接而不是表单来做到这一点?

【问题讨论】:

    标签: javascript http node.js rest express


    【解决方案1】:

    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。我打算用它来删除会话,所以我认为安全隐患没有那么大?
    • 是的,在这种情况下它是无害的。但是对于这样的事情我还是会使用 AJAX...
    • 并且我认为我需要在自定义 methodOverride 中间件中明确检查删除会话的路由,以便有人不会将查询字符串参数注入另一个 DELETE 路由的 url,并尝试做一些时髦的 CSRF 攻击
    • 我会说 AJAX 的工作量较少:p(无论如何,既然你的问题得到了回答,请考虑接受答案)
    • 你可能是对的。出于好奇,您喜欢将哪些框架/库用于您的 AJAX 解决方案?纯javascript、jquery、backbone.js?
    猜你喜欢
    • 2019-07-21
    • 2017-03-09
    • 2016-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-07
    • 2016-10-04
    相关资源
    最近更新 更多