【问题标题】:Ember.js - rest adapter sends request to wrong urlEmber.js - 休息适配器将请求发送到错误的 url
【发布时间】:2015-07-16 15:15:44
【问题描述】:

我的模型定义如下:

服务器

DS.Model.extend({
    name: DS.attr('string'),
    databases: DS.hasMany('database', {async: true})
});

数据库

DS.Model.extend(BaseModelMixin, {
    name: DS.attr('string'),
    server: DS.belongsTo('server'),
    schemas: DS.hasMany('schema', {async: true})
});

路由器设置如下:

Router.map(function() {
    this.resource('servers', { path: '/' }, function() {
      this.resource('server', { path: '/servers/:serverid'}, function () {
          this.resource('databases', { path: '/databases' }, function () {
              this.resource('database', { path: '/:databaseid'}, function () {
                  this.resource('catalogues', { path: '/catalogues' });
                  this.resource('eventtriggers', { path: '/eventtriggers' });
                  this.resource('extensions', { path: '/extensions' });
                  this.resource('schemas', { path: '/schemas' }, function () {
                      this.resource('schema', { path: '/:schemaid' }, function () {
                          this.resource('new-table');

                          this.resource('tables', { path: '/tables' }, function () {
                              this.resource('table', { path: '/:tableid' });
                          });
                      });
                  });
                  this.resource('replication', { path: '/replication' });
              });
          });
      });
    });
});

在我的应用程序中,我有一个菜单,允许我在服务器和它的数据库之间导航。在这样做的同时,DS.RESTAdapter 向模拟服务器发送请求以检索数据。它应该向这些 url 发送请求:

/api/servers

/api/servers/1

/api/servers/1/databases

/api/servers/1/databases/1

它正在向/api/databases url 发送请求,而不用正确的路径作为前缀。我该怎么办?

【问题讨论】:

标签: javascript rest ember.js


【解决方案1】:

您可能需要定义一个适配器。请查看 Ember 指南中的此页面:http://guides.emberjs.com/v1.12.0/models/the-rest-adapter/

如果没有定义适配器,它会在您当前的域中寻找一个 api 文件夹。

基本上,你想做这样的事情:

export default DS.RESTAdapter.extend({
  host: 'https://api.example.com'
});

希望这会有所帮助。

更新:

这是我使用 Ember-CLI 的当前项目中的一些代码(稍作编辑)。也许这里有一个金块:

适配器:

import DS from "ember-data";

export default DS.RESTAdapter.extend({
  host: 'http://localhost:8080'
});

路线:

import Ember from 'ember';
import config from './config/environment';

var Router = Ember.Router.extend({
  location: config.locationType
});

Router.map(function() {
  this.route('human', {'path': '/humans'}, function() {
    this.route('edit', {'path': ':human_id/edit'}, function() {
      this.route('remove', { path: 'remove' });
    });
    this.route('add');
  });

型号:

人类

import Ember from 'ember';
import DS from 'ember-data';

export default DS.Model.extend({
  categories: DS.hasMany('category', {async: true}),
  groups: DS.hasMany('group', {async: true}),
  tags: DS.hasMany('tag', {async: true}),
  first_name: DS.attr('string'),
  last_name: DS.attr('string'),
  born: DS.attr()
});

类别

import DS from 'ember-data';

export default DS.Model.extend({
  name: DS.attr('string')
});

【讨论】:

  • 不是这样的。我定义了一个测试适配器,通常一切都做对了。问题是(经过几个小时的研究后出现)embers 的重新适配器不支持开箱即用的嵌套路由......
  • 我在我的应用程序中使用嵌套路由,没有进行任何修改。您使用的是什么版本的 Ember/Ember Data?我注意到您正在使用我不熟悉的 BaseModelMixin。此外,最新版本的 Ember 仅使用“路由”而不是“资源”。
  • 我使用的是最新的,所以 ember 1.13.3 和 ember-data 1.13.5(哇,对吗?我最近更新了整个开发环境,并没有注意到 ember-数据版本更改)。 BaseModelMixin 是我的代码,它提供了一些实用方法。它与路由无关。
  • 我将路由更改为使用 route 方法,但应用程序适配器的行为仍然相同 - 它尝试将请求发送到 /api/databases/1 而不是 /api/servers/1/databases/1
  • 感谢代码 sn-p。当我回到家时,我会检查它并接受你的回答,如果它对我有用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多