请求的资源上不存在“Access-Control-Allow-Origin”标头。 ExpressJs

Posted

技术标签:

【中文标题】请求的资源上不存在“Access-Control-Allow-Origin”标头。 ExpressJs【英文标题】:No 'Access-Control-Allow-Origin' header is present on the requested resource. ExpressJs 【发布时间】:2015-07-02 21:22:08 【问题描述】:

我知道之前有人问过这个问题,但我遇到了 cors 问题,即使我认为我在每个请求上都设置了正确的标头。我无法获得在中间件中设置标头的标准方法,因此我为每个 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);

到目前为止,这适用于获取和发布,但对于删除它不起作用:

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

【问题讨论】:

我拥有/应该可以控制我可以发出的请求,因为 expressjs api 是由我创建的……这正是问题所在。如果您阅读了您会知道我已经可以 POST 和 GET 的问题,我只是不能 DELTE 【参考方案1】:

您已经很接近了,您需要稍微改变一下定义中间件的方式。

定义中间件的顺序在 Node.js 中很重要。下面的代码基本上允许对所有请求进行 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); 
        );
);

【讨论】:

以上是关于请求的资源上不存在“Access-Control-Allow-Origin”标头。 ExpressJs的主要内容,如果未能解决你的问题,请参考以下文章

django中的“请求的资源上不存在'Access-Control-Allow-Origin'标头”

如何解决请求的资源上不存在“Access-Control-Allow-Origin”标头

Http.post 请求的资源上不存在“Access-Control-Allow-Origin”标头

请求的资源发布请求上不存在“Access-Control-Allow-Origin”标头

Angular 2请求的资源上不存在“Access-Control-Allow-Origin”标头[重复]

API 请求错误 - 请求的资源上不存在“Access-Control-Allow-Origin”标头