Node.js Can';不能让CORS在Firefox中工作
我试图得到一个使用平均堆栈的简单示例,我注意到我的删除请求在Firefox中不起作用。我相信这是因为CORS 当我单击一个链接,用angularJS向我的ExpressJS后端提交一个删除请求时,我看到首先调用了GET请求,然后调用了实际的删除请求,但删除请求从未完成 这一切似乎都在Chrome中工作,没有问题。没有调用意外的GET请求,删除请求实际完成。如何在Firefox中实现这一点 cors的快速部分:Node.js Can';不能让CORS在Firefox中工作,node.js,angularjs,express,firefox,Node.js,Angularjs,Express,Firefox,我试图得到一个使用平均堆栈的简单示例,我注意到我的删除请求在Firefox中不起作用。我相信这是因为CORS 当我单击一个链接,用angularJS向我的ExpressJS后端提交一个删除请求时,我看到首先调用了GET请求,然后调用了实际的删除请求,但删除请求从未完成 这一切似乎都在Chrome中工作,没有问题。没有调用意外的GET请求,删除请求实际完成。如何在Firefox中实现这一点 cors的快速部分: // CORS Stuff in app.js app.all('*', funct
// CORS Stuff in app.js
app.all('*', function (req, res, next) {
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Headers", "X-Requested-With, Content-Type, Authorization, Content-Length");
res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,OPTIONS');
if(req.method == 'OPTIONS') {
res.send(204);
//next();
} else {
next();
}
//res.send(200);
});
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));
然后我有了这个note.js文件
exports.delete = function(db) {
return function(req, res) {
console.log('were in delete middleware');
//var note_id = req.body.id;
var note_id = req.params.id;
console.log("note_id = "+note_id);
var collection = db.get('notes');
collection.remove(
{_id: note_id}
),
function(err, doc) {
console.log('were in delete middleware function');
// If it failed, return error
if (err) {
console.log('were in delete error');
res.send("There was a problem deleting that note from the database.");
} else {
console.log('were in delete success');
res.send(200);
}
}
}
}
我的浏览器url是http://localhost:63342/express_example/public/#/
更新
我的服务器用以下命令响应飞行前请求:
服务器控制台:
选项/注释/53568807130e0f701f000001 200毫秒-2b
获取/注释304 8ms
浏览器控制台:
您所做的工作的问题是,它会将服务器打开,以接收来自所有域的请求。之前失败的原因是,如果您注意到请求头的主机为
localhost:3000
,但您的服务器仅接受来自localhost:63342
您可能不需要担心将其向所有域开放,除非您担心其他人制作的应用程序正在攻击您的服务器,而该服务器将在客户端计算机上运行。任何人都可以使用fiddler或任何REST客户端(如Advanced REST client)访问服务器。除非您的Express处理程序实际删除了对象,否则您可能不应该使用204响应自动回复。您没有在此处发布处理程序,但对于Mongoose/MongoDB,它可能看起来像:
app.delete('/records/:recordId', function(req, res){
req.record.remove(function(err){
if (err) {
console.log("Error deleting record");
return res.json(500, {error: err});
}
return res.json(204);
});
});
所以这不是CORS的问题,代码中有一个小的逻辑错误 此呼叫的问题在于:
collection.remove(
{_id: note_id}
),
我假设它需要第二个参数,它是回调函数,这可能就是为什么在语句结尾使用,
而不是代码>。您还将回调函数定义为下一条语句,但从不使用它。因此,为什么删除永远不会结束,回调永远不会被调用,因为它没有传递到集合.remove()
调用
请尝试以下方法:
var collection = db.get('notes');
collection.remove(
{_id: note_id},
function(err, doc) {
console.log('were in delete middleware function');
// If it failed, return error
if (err) {
console.log('were in delete error');
res.send("There was a problem deleting that note from the database.");
} else {
console.log('were in delete success');
res.send(200);
}
});
不确定为什么这对Chrome有效,而对firefox无效,但如果必须猜测的话,Chrome可能会从您的CORS处理程序中获得204并接受它。这只是一个猜测,因为您上面发布的代码永远不会向客户端返回响应。您的服务器用什么响应飞行前请求?我已用飞行前请求的详细信息更新了问题。@Catfish请发布删除处理程序的代码。正如您对204 to DELETE的响应示例所示,请求未被浏览器阻止,因此这对我来说不是CORS问题,而是错误的删除处理程序。我已更新了问题中的代码,提供了更多详细信息。他的来源是63342,服务器(主机头)位于3000。在我看来没问题,但它实际上对Chrome不起作用。我一定是改变了一些东西来得到这个错误,并认为它在chrome中工作。你说这个解决方案很好用。感谢您指出这个简单的语法错误。