gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 17:28:47 27 4
gpt4 key购买 nike

在我的 Express 应用程序中,当调用下面的 DELETE 方法时,会立即调用 GET 方法,并且它在我的 Angular 代码中给出一个错误,表示它需要一个对象,但得到一个数组。

当我在 DELETE 方法中显式执行 res.send(204); 时,为什么会调用我的 GET 方法以及如何解决此问题?

服务器控制台:

DELETE /notes/5357ff1d91340db03d000001 204 4ms
GET /notes 200 2ms - 2b

express 备注路线

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 Controller

$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 }
});
});

** 更新 **为了帮助描绘图片,这是我得到的 Angular 误差:

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

最佳答案

服务器端

您正在 delete 函数中从集合中删除一个元素。这是异步完成的,并在完成时调用回调。

在此期间,会执行其他请求,这就是为什么您的 GET 请求在您的 DELETE 请求完成之前执行的原因。

同样的情况也发生在您的 get 函数中,您试图从集合中查找元素,但该函数过于异步。

但这只是服务器端,没关系,它应该以这种方式工作,您的问题位于客户端。

客户端

如果您想在收到笔记后删除它,则必须在 Angular Controller 中使用回调函数,该函数仅在您收到笔记时才会被调用(如果您需要有关以下方面的帮助)请向我们展示您的 noteService Angular 代码)。

这是一些基本的 javascript 理解问题,操作通常是异步进行的,您需要回调来拥有执行链。

也许尝试做这样的事情:

$scope.delete = function(note_id) {
var note = noteService.get({ id: note_id }, function()
{
note.$delete();
});
}

你的代码没有意义,为什么$scope.delete中有一个get?为什么不简单地执行以下操作:

$scope.delete = function(note_id) {
noteService.delete({ id: note_id });
}

错误

我认为您收到此错误是因为您的服务器在 exports.delete 函数中发送了内容。当 Angular 需要一个对象时,您正在发送字符串或根本不发送任何内容(REST API 从不发送字符串)。您应该发送类似的内容:

res.send({
results: [],
errors: [
"Your error"
]
});

关于javascript - ExpressJS 为什么在 DELETE 方法之后调用我的 GET 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23271114/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com