ExpressJS为什么在我的DELETE方法之后调用我的GET方法?

时间:2014-04-24 13:59:00

标签: javascript node.js angularjs express mean-stack

在我的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方法返回整个集合。

1 个答案:

答案 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"
    ]
});