允许对 express/node.js 应用程序的 CORS REST 请求
Posted
技术标签:
【中文标题】允许对 express/node.js 应用程序的 CORS REST 请求【英文标题】:Allow CORS REST request to an express/node.js app 【发布时间】:2013-03-29 07:46:47 【问题描述】:我是 node.js/express 的新手。我看到了这篇文章 (Allow CORS REST request to a Express/Node.js application on Heroku),但建议的解决方案不起作用。
我只是调用 mapquest api 来获取一些数据。
这是我的 server.js 的一部分:
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)
console.log('hit options');
res.send(200);
else
next();
;
app.configure(function()
console.log('configuring app');
app.use(allowCrossDomain);
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(app.router);
app.use(express.static(__dirname + '/public'));
//app.use(express.static(path.join(application_root, "public")));
app.use(express.errorHandler( dumpExceptions: true, showStack: true ));
);
/**
* Main route
*/
app.get('/', function (req, res, next)
console.log("getting /");
Project.findAll()
.success(function (projects)
res.render('index', projects: projects );
)
.error(next);
);
这是我的客户端 main.js 的一部分:
$('#spec').click(function(ev)
var form = $(this);
$.ajax(
url: "http://www.mapquestapi.com/geocoding/v1/address?key=<mykey>"
, type: 'POST'
, datatype: 'json'
, contentType: 'json'
, data:
location :
"postalCode":"99999"
, options : thumbMaps : false
, success: function(resp)
$('#mapdata').html(resp);
, error : function(resp)
$('#mapdata').html(resp);
);
);
这是我在 chrome 开发窗口中的请求标头:
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:accept, origin, content-type
Access-Control-Request-Method:POST
Connection:keep-alive
Host:www.mapquestapi.com
Origin:http://localhost:3000
Referer:http://localhost:3000/
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.43 Safari/537.31
这里是响应头:
Allow:TRACE, OPTIONS Content-Length:0 Date:Sun, 07 Apr 2013 03:18:48 GMT 服务器:Apache-Coyote/1.1
这是错误信息:
Origin http://localhost:3000 is not allowed by Access-Control-Allow-Origin.
【问题讨论】:
Server: Apache-Coyote/1.1
是怎么回事?这不是正常的 Node 事情。您的应用程序是否在代理后面运行?如果是这样,它可能会剥离这些标题。
没有在 apache 代理后面运行...这确实很奇怪
【参考方案1】:
CORS 仅在 targetted HTTP 服务器启用它时才有效。在您的情况下,目标 HTTP 服务器是 www.mapquestapi.com
。在您自己的服务器中启用 CORS 不会在 MapQuest 服务器上启用 CORS。
我认为您要么需要检查 MapQuest 是否支持 JSONP(从 this example code from MapQuest 判断很可能是这样),要么可能使用 MapQuest 提供的 geocoding API。
如果这两个选项都不是一个选项,那么您剩下的唯一选择是在您自己的服务器上创建一个代理,您可以通过该代理向 MapQuest 服务器发送请求(您的服务器将从 MQ 服务器请求数据并将其发送回您的客户端代码)。
【讨论】:
抢劫,感谢您的回复。我最终在节点上创建了一个代理来调用 MQ 服务器将数据返回给客户端。这似乎是迂回的,但它完成了工作 - 谢谢!以上是关于允许对 express/node.js 应用程序的 CORS REST 请求的主要内容,如果未能解决你的问题,请参考以下文章