在Node.JS中的HTTP DELETE动词

10

在我能够向node.js应用程序发出DELETE请求之前,我需要设置任何配置吗?

我可以进行GET、POST或PUT请求,但DELETE请求无法工作。

DELETE http://localhost:8081/api/1.0/entry从路由记录器中返回undefined,我正在使用express注册路由。但看起来我甚至无法解析url / verb。

这是我调用它的方式:

rows.find('a.remove').on('click', function(){
    $.ajax({
        url: '/api/1.0/entry',
        type: 'DELETE'
    }).done(function(res){
        var row = $(this).parentsUntil('tbody');
        row.slideUp();
    });
});

示例日志

GET / 200 18ms  
GET /author/entry 200 10ms  
GET /api/1.0/entry 200 2ms  
GET /api/1.0/entry 200 1ms  
GET /api/1.0/entry 200 1ms  
undefined

1
在Express中无需进行任何配置... 只需使用app.delete('/api/1.0/entry',function(req, res){即可。 - almypal
我以为应该是.del - bevacqua
没错,你也可以使用 .del。我一直都用 .delete。 - almypal
你使用的是什么浏览器? - Aaron Dufour
谷歌浏览器和Edge浏览器,为什么?我可以在控制台中看到请求被发送了,但它从未到达服务器。 - bevacqua
@Nico jQuery文档声称一些浏览器无法正确发送PUT/DELETE ajax请求。不过,这应该可以正常工作。 - Aaron Dufour
2个回答

10
希望这能帮到你:
  • 启用日志作为第一个中间件以确保请求正在进行:

    app.use(express.logger());

  • 使用methodOverride()中间件:

    app.use(express.bodyParser());

    app.use(express.methodOverride()); // 在隐藏字段中查找DELETE动词

  • 创建.del()路由:

    app.del('/api/1.0/entry', function(req, res, next) { ... });


日志记录已启用,但当请求到达时,我得到了undefined作为路由,这真的很奇怪。 - bevacqua
如果路由是 undefined,那么问题是客户端的,而不是服务器端的。Express 不会将 undefined/api/1.0/entry 匹配。 - hunterloftis
但是在路由中间件之前,我得到了undefined,在express.logger中,请参考原帖中的示例列表。 - bevacqua
我同意Golo的观点,看到相关的服务器端代码会很有用,特别是中间件堆栈。另外建议您创建一个最小的服务器,仅具有一个DELETE路由进行调试。请问您在堆栈中是否使用了methodOverride()中间件? - hunterloftis
由于Express不再支持express.bodyParserexpress.methodOverride(变化不大,现在你只需通过npm安装它们即可),所以你可能需要更新这个回答。 - mms27
显示剩余2条评论

1

并非所有浏览器都支持设置类型的PUT和DELETE值:

请参阅文档http://api.jquery.com/jQuery.ajax/

您可以在Ajax请求中使用POST类型,包括 data:{_method:'delete'}

$.ajax({
    data:{_method:'delete'},
    url: '/api/1.0/entry',
    type: 'POST'
}).done(function(res){
    var row = $(this).parentsUntil('tbody');
    row.slideUp();
});

所有现代浏览器都支持它们。 - v010dya

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接