首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >允许对Heroku上的Express/Node.js应用程序发出CORS REST请求

允许对Heroku上的Express/Node.js应用程序发出CORS REST请求
EN

Stack Overflow用户
提问于 2012-06-13 01:33:13
回答 4查看 83.7K关注 0票数 101

我已经在node.js的express框架上写了一个REST API,用于处理来自Chrome的js控制台的请求,以及地址栏等。我现在正在尝试让它工作于来自不同域(CORS)的另一个应用程序的请求。

第一个请求由javascript前端自动发出,是对/api/search?uri=的请求,在"preflight“OPTIONS请求上似乎失败了。

在我的express应用程序中,我正在添加CORS标头,使用:

代码语言:javascript
复制
var allowCrossDomain = function(req, res, next) {
    res.header('Access-Control-Allow-Origin', '*');
    res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,OPTIONS');
    res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization, Content-Length, X-Requested-With');

    // intercept OPTIONS method
    if ('OPTIONS' == req.method) {
      res.send(200);
    }
    else {
      next();
    }
};

和:

代码语言:javascript
复制
app.configure(function () {
  app.use(express.bodyParser());
  app.use(express.methodOverride());
  app.use(app.router);
  app.use(allowCrossDomain);
  app.use(express.static(path.join(application_root, "public")));
  app.use(express.errorHandler({ dumpExceptions: true, showStack: true }));
});

在Chrome控制台上,我得到了这些头文件:

请求地址:http://furious-night-5419.herokuapp.com/api/search?uri=http%3A%2F%2Flocalhost%3A5000%2Fcollections%2F1%2Fdocuments%2F1

请求方法:选项

状态码:200正常

请求头

代码语言:javascript
复制
Accept:*/*
Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-US,en;q=0.8
Access-Control-Request-Headers:origin, x-annotator-auth-token, accept
Access-Control-Request-Method:GET
Connection:keep-alive
Host:furious-night-5419.herokuapp.com
Origin:http://localhost:5000
Referer:http://localhost:5000/collections/1/documents/1
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_4) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.56 Safari/536.5

查询字符串参数

代码语言:javascript
复制
uri:http://localhost:5000/collections/1/documents/1

响应报头

代码语言:javascript
复制
Allow:GET
Connection:keep-alive
Content-Length:3
Content-Type:text/html; charset=utf-8
X-Powered-By:Express

这看起来像是API应用程序没有发送正确的报头吗?

谢谢。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-06-16 04:16:14

我在一个干净的ExpressJS应用程序上检查了你的代码,它工作得很好。

尝试将您的app.use(allowCrossDomain)移到configure函数的顶部。

票数 66
EN

Stack Overflow用户

发布于 2016-09-15 16:08:24

为了支持cookies,您需要下面这行xhr.withCredentials = true;

mdn docs xhr.withCredentials

在Express Server中,将此块添加到所有其他块之前

代码语言:javascript
复制
`app.all('*', function(req, res, next) {
     var origin = req.get('origin'); 
     res.header('Access-Control-Allow-Origin', origin);
     res.header("Access-Control-Allow-Headers", "X-Requested-With");
     res.header('Access-Control-Allow-Headers', 'Content-Type');
     next();
});`
票数 4
EN

Stack Overflow用户

发布于 2017-07-18 08:05:18

这不可能是大多数人浏览这个问题的情况,但我有完全相同的问题,解决方案与CORS无关。

原来JSON Web令牌秘密string没有在环境变量中定义,因此令牌无法签名。这会导致任何依赖检查或签名令牌来获取超时并返回503错误的POST请求,告诉浏览器CORS中有问题,而事实并非如此。在Heroku中添加环境变量解决了这个问题。

我希望这对某些人有帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11001817

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档