无法让CORS在Firefox中运行

时间:2014-04-18 14:40:27

标签: node.js angularjs firefox express cors

我试图让一个简单的例子使用MEAN堆栈,我注意到我的DELETE请求在Firefox中不起作用。我相信这是由于CORS。

当我点击一个链接向我的ExpressJS后端提交带有angularJS的DELETE请求时,我看到首先调用了一个GET请求,然后调用了实际的DELETE请求,但DELETE请求永远不会完成。

DELETE REQUEST

这一切似乎都适用于Chrome没问题。没有调用意外的GET请求,DELETE请求实际上已完成。如何在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);
            }
        }
    }
}

我的浏览器网址为http://localhost:63342/express_example/public/#/

更新

我的服务器使用以下命令响应预检请求:

服务器控制台: 选项/注释/ 53568807130e0f701f000001 200 0ms - 2b GET / notes 304 8ms

浏览器控制台: enter image description here

3 个答案:

答案 0 :(得分:1)

因此,这不是CORS的问题,您的代码中存在一个小的逻辑错误。

问题在于这个电话:

collection.remove(
    {_id: note_id}
),

我将假设它需要第二个参数,这是一个回调函数,这可能就是你用,而不是;结束语句的原因。您还将回调函数定义为下一个语句,但从不使用它。因此,为什么删除永远不会结束,回调永远不会被调用,因为它没有被传递到collection.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而只是接受它。这只是猜测,因为您上面发布的代码永远不会将响应返回给客户。

答案 1 :(得分:0)

除非您的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);
  });
});

答案 2 :(得分:-1)

您正在做的问题是它会打开您的服务器以接收来自所有域的请求。之前失败的原因是,如果您发现请求标头有localhost: 3000的主机,但您的服务器只接受来自localhost: 63342的请求

您可能不需要担心将其打开到所有域,除非您担心其他人制作的应用程序会在客户端计算机上运行您的服务器。任何人都可以使用fiddler或任何REST客户端(如高级REST客户端)来访问服务器。