我是 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 开发窗口中的请求 header :
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

这是响应 header :



这是错误消息:
Origin http://localhost:3000 is not allowed by Access-Control-Allow-Origin.

最佳答案

CORS 仅在目标 HTTP 服务器启用时才有效。在您的情况下,目标 HTTP 服务器是 www.mapquestapi.com 。在您自己的服务器中启用 CORS 不会在 MapQuest 服务器上启用 CORS。

我认为您要么需要检查 MapQuest 是否支持 JSONP(根据 this example code from MapQuest 判断很可能是),或者可能使用 MapQuest 提供的 geocoding API

如果这两个选项都不是一个选项,那么您剩下的唯一选择是在您自己的服务器上创建一个代理,您可以通过该代理向 MapQuest 服务器发送请求(您的服务器将从 MQ 服务器请求数据并将其发送回到您的客户端代码)。

关于jquery - 允许对 express/node.js 应用程序的 CORS REST 请求,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15858588/

10-09 14:31