No' Access-Control-Allow-Origin'标头出现在请求的资源上。 ExpressJs

时间:2015-04-24 10:06:34

标签: jquery ajax express cors asp.net-web-api

我知道之前已经问过这个问题,但即使我认为我在每个请求中都设置了正确的标题,我也有问题。我无法获得在中间件中设置标头的标准方法,因此我为每个api方法明确设置它们:

router.route('/books')
    .get(function(req, res){
        allowCORS(res);
        Repository.getAll().done(
            function(result) { res.json(result); }, 
            function(err) { res.send(err); }
        );  
    })
    .post(function(req, res) {
        allowCORS(res);
        Repository.save(req.body).done(
            function(object) { res.json(object); }, 
            function(err) { res.send(err); }
        );
});

和allowCors方法:

var allowCORS = function(res)
{ 
    res.setHeader('Access-Control-Allow-Origin', '*');
    res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE');
    res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type');

    // Set to true if you need the website to include cookies in the requests sent
    // to the API (e.g. in case you use sessions)
    res.setHeader('Access-Control-Allow-Credentials', true);
}

这适用于get和post BUT到目前为止,对于删除它不起作用:

router.route('/books/:id')   
    .delete(function(req, res) {
        allowCORS(res);
        Repository.del({ _id: req.params.id }).done(
            function(result){ res.json(result); }, 
            function(err){ res.send(err); });   
    });

浏览器中的上述错误。 我在这里错过了什么?我能够成功地从Fiddler编写删除请求,但不能从ajax脚本编写。 ajax看起来像这样:

$.ajax({
        url: url + '/' + id,
        type: 'DELETE',
        success: callback,
        error: errorCallback
        });

1 个答案:

答案 0 :(得分:0)

你很接近,你需要改变你定义中间件的方式。

定义中间件的顺序在Node中很重要。下面的代码基本上允许所有请求的CORS(*)。如果您只想在/books上允许,请执行res.header("Access-Control-Allow-Origin", "/book");

app.use(function(req, res, next) {
  res.header("Access-Control-Allow-Origin", "*");
  res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
  next();
});

router.route('/books')
    .get(function(req, res){
        Repository.getAll().done(
            function(result) { res.json(result); }, 
            function(err) { res.send(err); }
        );  
    })
    .post(function(req, res) {
        Repository.save(req.body).done(
            function(object) { res.json(object); }, 
            function(err) { res.send(err); }
        );
});