当前位置: 代码迷 >> JavaScript >> Backbone.js 不会发布到指定的 URL
  详细解决方案

Backbone.js 不会发布到指定的 URL

热度:60   发布时间:2023-06-13 11:45:23.0

我有一个使用此生成器运行的 Backbone.js 应用程序。 我需要向在不同服务器和域上运行的服务发出POST请求。 在我的模型上,我有以下内容:

urlRoot: 'https://custom.com/',

saveData: function(params) {
  this.set(params);
  if(this.isValid()) {
    this.save(null, {
      url: 'api/v1/data',
      success: function(model, response, options) {
        // success
      },
      error: function(model, response, options) {
        // error
      }
    });
  }
}

当我尝试发布数据时,它会将数据发布到http://localhost:9000/api/v1/data 知道为什么 Backbone 选择POST到它正在运行的服务器,而不是我提供的设置 ( https://custom.com/api/v1/data )?

在我的服务器上,我在 NodeJS 之上运行 Restify(为了测试目的,我允许来自任何客户端的源)。 这是我设置 CORS 的方法:

// Setup CORS
api.use(function(req, res, next) {
  res.header('Access-Control-Allow-Origin', '*');
  res.header('Access-Control-Allow-Methods', 'GET,POST,PUT,DELETE, OPTIONS');
  res.header('Access-Control-Allow-Headers', 'X-Requested-With');
  return next();
});

我怀疑服务器有问题,因为它甚至没有被客户端访问,因为指定的 URL 以某种方式自动映射到http://localhost:9000/api/v1/data而不是https://custom.com/api/v1/data

更新:如果我使用 jQuery“手动”执行此操作(不使用 Backbone 的 API),它会起作用:

saveData: function() {
  $.ajax({
     type: 'POST',
     data: this.toJSON(),
     url: 'https://custom.com/api/v1/data'
  })
  .success(function() {
    // success
  })
  .fail(function() {
    // fail
  });
}

有没有办法使用 Backbone 的 API 来做到这一点?

url作为选项传递给Backbone.Model.prototype.save将绕过 url 生成逻辑(即urlRoot )并假设 url 选项是完整路径(如果不发布到当前域,则包括域)。

您应该将urlRoot设置为实体的路径(或您的后端平台可能会调用它的任何内容),因此在您的情况下它应该是:

var MyModel = Backbone.Model.extend({
    urlRoot: 'https://custom.com/api/v1/data'
});
var myModel = new MyModel();
myModel.save(); // POST https://custom.com/api/v1/data
// Assuming that returns an id of '123';
myModel.save(); // PUT https://custom.com/api/v1/data/123
myModel.destroy(); // DELETE https://custom.com/api/v1/data/123

如果您的服务器未设置为处理 Backbone 风格的 RESTful 端点,那么您可能只想覆盖Backbone.Model.prototype.url而不是urlRoot

如果您只想测试对服务器的调用,您可以下载一个 chrome 扩展程序。 它将允许您拨打不同的域。 在这里: :

将请求发布到不同的域将无法在浏览器中工作。 更好的处理方法是您可以在服务器中设置一些重定向规则。