Node.js Can';不能让CORS在Firefox中工作

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

我试图得到一个使用平均堆栈的简单示例,我注意到我的删除请求在Firefox中不起作用。我相信这是因为CORS

当我单击一个链接,用angularJS向我的ExpressJS后端提交一个删除请求时,我看到首先调用了GET请求,然后调用了实际的删除请求,但删除请求从未完成

这一切似乎都在Chrome中工作,没有问题。没有调用意外的GET请求,删除请求实际完成。如何在Firefox中实现这一点

cors的快速部分:

// 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中工作。你说这个解决方案很好用。感谢您指出这个简单的语法错误。