jquery - 允许 CORS REST 请求到 express/node.js 应用程序

标签 jquery ajax node.js express cors

我是 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 dev 窗口中的请求 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

这里是响应头:

Allow:TRACE, OPTIONS Content-Length:0 Date:Sun, 07 Apr 2013 03:18:48 GMT Server:Apache-Coyote/1.1

这是错误信息:

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 判断很可能是),要么使用 geocoding API MapQuest 提供的。

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

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

相关文章:

jquery - JSONP请求错误处理

node.js - connect-mongo session 集合为空

javascript - Ajax 结果在 alert() 中

ajax - 从 ajax 和 ActionResult 下载文件

node.js - kafka-node 异步消费者处理程序

javascript - 字符串日期转unix时间戳

jquery - HTML5/JavaScript 和基于 jQuery 的图表库之间的区别

javascript - jQuery:更改输入值不用于新添加

javascript - 如果显示元素,想要添加填充 - jquery

javascript - HTML onClick 不适用于 Windows Phone