AngularJS ngResource 删除事件不调用回调

Posted

技术标签:

【中文标题】AngularJS ngResource 删除事件不调用回调【英文标题】:AngularJS ngResource delete event not calling callback 【发布时间】:2016-04-04 13:13:39 【问题描述】:

我有这个代码:

dogsResource.delete(id: $stateParams.dogId, angular.noop,
        function(value, responseHeaders)
            //Success
            console.log(value);
            console.log(responseHeaders);
        ,
        function(httpResponse)
            //Error
            console.log(httpResponse);
        
    );

删除完成,问题是既没有调用成功也没有调用错误。我也尝试过使用实例(也就是说,使用 $delete),但它也没有工作。

我尝试使用其他方法测试回调,例如 get

$scope.dog = dogsResource.get(id: $stateParams.dogId, function(value, res)
    console.log(value);
);

而且它有效。我不知道为什么会这样,因为这只狗正在从数据库中删除。

谢谢

更新

dog资源代码

// Return the dogs resource
.factory('dogsResource', ['$resource', function($resource)
    return $resource("http://localhost:5000/dogs/:id",id: "@id",update: method: "PUT");
])

更新 2

我发现了错误。它在 RESTful API(Node js)中。该方法没有向 Angular 发送任何内容,因此没有触发回调:

//DELETE - Delete a dog with specified ID
exports.deleteDog = function(req, res) 
    console.log('DELETE' + req.params.id);

    Dog.findById(req.params.id, function(err, dog) 
        dog.remove(function(err) 
            if(err) return res.status(500).send(err.message);
            console.log('Succesfully deleted.');
            res.status(200);
        )
    );
;

res.status(200) 替换为res.status(200).end() 触发了回调。

感谢大家的宝贵时间。

【问题讨论】:

我知道这听起来很明显,但 angular.noop 应该存在吗? @camden_kid 文档说非 http get 操作应该有一个 postData,我不需要那个。顺便说一句,我也尝试过使用 null、 甚至忽略它。 是的,根据***.com/questions/16579201/…,你是对的。控制台有错误吗? 无,如我所说,删除完成,但不打印日志。 你试过使用 promise 属性吗?像这样dogsResource.delete(id: $stateParams.dogId).$promise.then(function(value) console.log('value', value)); 【参考方案1】:

我建议你不要使用

res.status(200).end()

实际上,通常当您在 expressJS 中使用 REST 服务删除对象时,常见的情况是发送已删除的对象作为响应,因为前端获取该对象可能很有用(并确保它是好对象)。

所以不要使用

res.status(200).end()

使用

res.send(狗)

或者如果你想发送一个空响应,删除操作的状态码应该是:

res.status(204).end()

204 无内容

注意,不需要设置状态码,默认为200,所以设置状态码为200是没有用的。

完成一个http响应需要发送关闭请求。 end 方法或 send 方法可以做到这一点。将状态代码设置为响应 http 永远不会向前端发送任何内容。这就是为什么您的角度回调从未被触发的原因。

所以我建议你将标签 expressjs 添加到你的问题中,因为这不是 AngularJS 的问题,而是一个真正的 expressJS 错误。

【讨论】:

你是对的。自从删除完成后,我认为它是有角度的,但后来我发现它实际上是 de Api。我会检查你所说的,所有其他方法(获取、保存等)发送res.send(dog),但删除是我在操作中发布的。我会添加标签。【参考方案2】:

我最近正在使用 ngResource。就我而言,我在该 api 调用中使用了三个参数。因此,您可以使用

dogsResource.delete(id: $stateParams.dogId, function(value, responseHeaders)
            //Success
            console.log(value);
            console.log(responseHeaders);
        ,
        function(httpResponse)
            //Error
            console.log(httpResponse);
        
    );

希望对你有帮助。

【讨论】:

【参考方案3】:

使用$resource 对象的承诺返回。作为 $resource 对象默认返回一个 promise 对象,并且该 promise 对象在 .$promise 变量上可用 $resource API 方法。

代码

dogsResource.delete(id: $stateParams.dogId).$promise.then(function(data)//Success
     console.log(value);
,
function(httpResponse) //Error
    console.log(httpResponse);
);

【讨论】:

@CamiloR 你能在你的问题中添加你的dogsResource 代码吗? 这里是资源的代码,希望对您有所帮助。 @CamiloR 尝试将您的 $resource 对象更改为 $resource("http://localhost:5000/dogs/:id", ,update: method: "PUT"),因为您在传递其值时使用了相同的属性名称 id【参考方案4】:

在您的代码中,第二个参数是angular.noop

dogsResource.delete(id: $stateParams.dogId, angular.noop,
        function(value, responseHeaders)
            //Success
            console.log(value);
            console.log(responseHeaders);
        ,
        function(httpResponse)
            //Error
            console.log(httpResponse);
        
    );

根据ngResource Source Code,如果您将第二个参数设置为一个函数(angular.noop 一个函数),那么它将使用第二个参数作为成功回调。由于第二个参数是空操作,所以调用它时不会发生任何事情。

尝试将第二个参数设置为function (r) console.log (r) ,看看会得到什么。

【讨论】:

不,不是那样,正如我在操作的评论中所说的那样。即使按照您所说的进行更改,也不会调用回调。

以上是关于AngularJS ngResource 删除事件不调用回调的主要内容,如果未能解决你的问题,请参考以下文章

根据所选项目在 ngResource (angularjs) 中查询数据

AngularJS ngResource 不发送自定义标头

AngularJS:如何使用 ngResource 处理成功和错误回调?

我如何在 angularjs 中使用 Restful。我使用了 ngResource 但它不起作用。如果我使用 ngResource,js 文件 nt 正在执行

使用 ngResource 在 AngularJS 中设置 enctype

AngularJS 错误:模块“ngResource”不可用!您要么拼错了模块名称,要么忘记加载它