Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ajax 对backbone.js的跨域CORS支持_Ajax_Node.js_Backbone.js_Express_Cors - Fatal编程技术网

Ajax 对backbone.js的跨域CORS支持

Ajax 对backbone.js的跨域CORS支持,ajax,node.js,backbone.js,express,cors,Ajax,Node.js,Backbone.js,Express,Cors,我正在尝试为我的主干应用程序实现跨域设置 我的服务器(express.js)允许跨域和凭据: var allowCrossDomain = function(req, res, next) { var allowedHost = [ 'http://localhost:3001', 'http://localhost:7357' ]; if(allowedHost.indexOf(req.headers.origin) !== -1) { res.heade

我正在尝试为我的主干应用程序实现跨域设置

我的服务器(express.js)允许跨域和凭据:

var allowCrossDomain = function(req, res, next) {
  var allowedHost = [
    'http://localhost:3001',
    'http://localhost:7357'
  ];

  if(allowedHost.indexOf(req.headers.origin) !== -1) {
    res.header('Access-Control-Allow-Credentials', true);
    res.header('Access-Control-Allow-Origin', req.headers.origin)
    res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,OPTIONS');
    res.header('Access-Control-Allow-Headers', 'X-CSRF-Token, X-Requested-With, Accept, Accept-Version, Content-Length, Content-MD5, Content-Type, Date, X-Api-Version');
    next();
  } else {
    res.send({auth: false});
  }
}

app.configure(function(){
    ....
    app.use(allowCrossDomain);
    ....
});
我的客户端(backbone.js)也配置为接受跨域:

define(["backbone", "jquery", "underscore"], function (BB, $, _) {
  return BB.Model.extend({

    idAttribute: "_id",

    initialize: function () {
      var that = this;

      $.ajaxPrefilter( function( options, originalOptions, jqXHR ) {
        options.crossDomain ={
          crossDomain: true
        };
        options.xhrFields = {
          withCredentials: true
        };
      });
    }
  });
});
现在,当我测试代码时(比如一个
POST
请求),我有一个非常特殊的行为:

var contacts = new Contacts;
contacts.create({'name': 'my name'});
浏览器将返回以下消息:

选项。。。404(未找到) jquery.js:8419


这完全把我弄糊涂了,因为主干网不支持
选项
http方法?

很可能,您的快速路线只指定
GET
和/或
POST
方法。比如说,

app.post('/some/api/method', function(req, res) { ... });
这意味着您只为
POST
s to/some/api/方法定义了路由处理程序,使用任何其他方法(如
GET
OPTIONS
)的请求将返回404

在某些情况下(例如发送自定义HTTP头),使用XHR请求跨源URL要求浏览器必须首先发出
选项
请求,以查看是否允许跨域请求。只有当
选项
请求成功(HTTP 200带有CORS头)时,浏览器才会发出实际请求

由于您只在服务器上定义了
POST
路由,因此
选项
请求失败,浏览器不发出请求。您需要正确响应
选项
请求:

app.options('/some/api/method', function(req, res) {
    // At this point, the `allowCrossDomain()` middleware will already have
    // taken care of the CORS stuff, so just return OK.
    res.send(200);
});
现在,飞行前的
OPTIONS
检查将通过,因此将向
POST
处理程序发出真正的请求


关于您的代码的额外评论:

  • 性能改进:
    • 使用对象来查找和验证原点,而不是数组。使用
      indexOf
      需要在每个请求上缓慢地迭代数组,其中使用对象允许快速查找。(请记住,JavaScript对象将其键存储在类似字典的数据结构中。)
    • 在验证函数之外定义
      allowedHosts
      ——它们不会更改,因此无需在每次调用
      allowCrossDomain
      时创建新对象(需要垃圾收集)
  • 当跨源检查失败时,您可能应该发送一个不成功的HTTP响应代码


最可能的情况是,您的快速路线只指定
GET
和/或
POST
方法。比如说,

app.post('/some/api/method', function(req, res) { ... });
这意味着您只为
POST
s to/some/api/方法定义了路由处理程序,使用任何其他方法(如
GET
OPTIONS
)的请求将返回404

在某些情况下(例如发送自定义HTTP头),使用XHR请求跨源URL要求浏览器必须首先发出
选项
请求,以查看是否允许跨域请求。只有当
选项
请求成功(HTTP 200带有CORS头)时,浏览器才会发出实际请求

由于您只在服务器上定义了
POST
路由,因此
选项
请求失败,浏览器不发出请求。您需要正确响应
选项
请求:

app.options('/some/api/method', function(req, res) {
    // At this point, the `allowCrossDomain()` middleware will already have
    // taken care of the CORS stuff, so just return OK.
    res.send(200);
});
现在,飞行前的
OPTIONS
检查将通过,因此将向
POST
处理程序发出真正的请求


关于您的代码的额外评论:

  • 性能改进:
    • 使用对象来查找和验证原点,而不是数组。使用
      indexOf
      需要在每个请求上缓慢地迭代数组,其中使用对象允许快速查找。(请记住,JavaScript对象将其键存储在类似字典的数据结构中。)
    • 在验证函数之外定义
      allowedHosts
      ——它们不会更改,因此无需在每次调用
      allowCrossDomain
      时创建新对象(需要垃圾收集)
  • 当跨源检查失败时,您可能应该发送一个不成功的HTTP响应代码


选项调用是飞行前请求:选项调用是飞行前请求: