在我的Express应用程序中,当调用下面的DELETE方法时,会立即调用GET方法,并且它在我的角度代码中给出了一个错误,该错误表明它是一个对象,但是有一个数组。 / p>
为什么在我的DELETE方法中明确地执行res.send(204);
时我的GET方法被调用,我该如何解决这个问题呢?
服务器控制台:
DELETE /notes/5357ff1d91340db03d000001 204 4ms
GET /notes 200 2ms - 2b
快速注释路线
exports.get = function (db) {
return function (req, res) {
var collection = db.get('notes');
collection.find({}, {}, function (e, docs) {
res.send(docs);
});
};
};
exports.delete = function(db) {
return function(req, res) {
var note_id = req.params.id;
var collection = db.get('notes');
collection.remove(
{ _id: note_id },
function(err, doc) {
// If it failed, return error
if (err) {
res.send("There was a problem deleting that note from the database.");
} else {
console.log('were in delete success');
res.send(204);
}
}
);
}
}
app.js
var note = require('./routes/note.js');
app.get('/notes', note.get(db));
app.post('/notes', note.create(db));
app.put('/notes/:id', note.update(db));
app.delete('/notes/:id', note.delete(db));
angularjs控制器
$scope.delete = function(note_id) {
var note = noteService.get();
note.$delete({id: note_id});
}
angularjs noteService
angular.module('express_example').factory('noteService',function($resource, SETTINGS) {
return $resource(SETTINGS.base + '/notes/:id', { id: '@id' },
{
//query: { method: 'GET', isArray: true },
//create: { method: 'POST', isArray: true },
update: { method: 'PUT' }
//delete: { method: 'DELETE', isArray: true }
});
});
**更新** 为了帮助绘制图片,我得到了角度误差:
Error: [$resource:badcfg] Error in resource configuration. Expected response to contain an object but got an array http://errors.angularjs.org/1.2.16/$resource/badcfg?p0=object&p1=array
我假设我收到此错误,因为我的删除方法正在调用我的get方法(不知何故)并且get方法返回整个集合。
答案 0 :(得分:2)
您要从delete
功能中删除某个集合中的元素。这是异步完成的,并在完成后调用你的回调。
在此期间,会执行其他请求,这就是GET
请求在DELETE
请求完成之前执行的原因。
在您的get
函数中也是如此,您尝试从集合中查找元素,而且此函数过于异步。
但这只是服务器方面而且很好,应该以这种方式工作,你的问题位于客户端。
如果您想删除之后的,则必须在角度控制器中使用回调函数,只有在得到注释时才会调用该函数(如果需要帮助,那个,向我们展示你的noteService
角度代码。
这是一些基本的javascript理解问题,操作通常是异步进行的,你需要回调才能拥有执行链。
也许尝试做这样的事情:
$scope.delete = function(note_id) {
var note = noteService.get({ id: note_id }, function()
{
note.$delete();
});
}
你的代码没有意义,为什么get
中有$scope.delete
?为什么不像以下那样简单:
$scope.delete = function(note_id) {
noteService.delete({ id: note_id });
}
我认为由于服务器在exports.delete
函数中发送的内容而导致此错误。当angular需要一个对象(REST API永远不会发送字符串)时,你根本不发送字符串或没有内容。你应该发送类似的东西:
res.send({
results: [],
errors: [
"Your error"
]
});