关于node处理ajax请求的困惑
发布于 3个月前 作者 xuyuan923 601 次浏览 来自 问答

今天在看一个node的视频课程,其中有一个浏览器发送了ajax type为‘delete’的请求,看到视频教程的源码,很震惊。 直接贴代码:

jquery处理ajax请求代码如下:

$(function () {
    $('.del').click(function (e) {
        var target = $(e.target);
        var id = target.data('id');
        var tr = $('.item-id-'+id);
        $.ajax({
            type: 'DELETE',
            url: "/admin/list?id=" +id
        })
            .done(function (results) {
            if (results.success === 1) {
                if (tr.length > 0) {
                    tr.remove()
                }
            }
        })
    })
})

node处理这个delete请求代码如下

app.delete('/admin/list',function(req,res){
    var id = req.query.id;
    if(id){
        Movie.remove({_id: id},function(err,movie){
            if(err){
                console.log(err)
            }
            else{
                res.json({success:1})
            }
        })
    }
});

上面的代码我测试运行是没有问题的。 问题来了,express API里面我没有找到app.delete()方法,对于ajax的get/post/put/delete请求,node代码是这么写的吗?app.get() app.post(),app.put(),app.delete()这么处理的吗?通常大神们的做法是怎样的?

12 回复

后来搜索看到这么一篇文章,Develop a RESTful API Using Node.js With Express and Mongoose 。贴出来看看,这篇文章这么写是不是过时了? 现在处理ajax的4种请求get/post/put/delete该用什么方法呢?

源码对于 https://www.npmjs.org/package/methods 这里面的每个方法都提供了支持。文档比较简单所以漏写了而已。

jQuery.ajaxSettings.xhr = window.ActiveXObject !== undefined ? // Support: IE6+ function() {

  return !this.isLocal &&
      /^(get|post|head|put|delete|options)$/i.test( this.type ) &&

      createStandardXHR() || createActiveXHR();

} : // For all other browsers, use the standard XMLHttpRequest object createStandardXHR; head|put|delete 都是post的马甲,这些方法要浏览器支持吧

@coolicer 嗯嗯,要看浏览器支持,否则除了 get 都是用 post 在模拟。 可以看看这里:https://www.npmjs.org/package/method-override

@alsotang 把put/delete类型改成post是可以用的,看来put/delete都是post的马甲没错。例如上面的代码改成:

$(function () {
    $('.del').click(function (e) {
        var target = $(e.target);
        var id = target.data('id');
        var tr = $('.item-id-'+id);
        $.ajax({
            type: 'POST',
            url: "/admin/list?id=" +id
        })
            .done(function (results) {
            if (results.success === 1) {
                if (tr.length > 0) {
                    tr.remove()
                }
            }
        })
    })
})

    var id = req.query.id;
    if(id){
        Movie.remove({_id: id},function(err,movie){
            if(err){
                console.log(err)
            }
            else{
                res.json({success:1})
            }
        })
    }
});

测试也是没有问题的。你说的method-override可以解决delete/put方法的兼容性问题,还没测试,应该可用。

从来都用的get、post,中低高应用全搞定- -

<form action="/" method="post">
    <input type="hidden" name="__method" value="delete" />
    <input type="submit" value="Submit" />
</form>

restFul提倡用delete,不要用post。

@tulayang 你这样做当然可以的。我是用的ajax异步删除,你用的是form的形式删除的。 还有,你这样的方法也是post,只是设置了value是delete。

回到顶部