无法在Ember.DefaultResolver.extend.podBasedComponentsInSubdir中读取undefined的属性'match'

aks*_*kst 5 ember.js ember-data ember-cli

我从控制台得到一个非常不透明的错误消息(在我意义上我没有参考点的不透明),我不完全确定在哪里看,我觉得它可能是库代码中的错误但在发布之前这个在github上我只是仔细检查一下这不是我自己的错.

问题

问题很简单,我打电话this.store.find('player'),希望获得所有玩家的列表,然后以某种列表显示它们,但我甚至没有超过装载部分.数据从服务器中提取并且看起来格式正确,但在route.model方法调用之后似乎失败了.并且错误消息似乎在ember.js库代码中的某处,没有任何指向我自己的代码.

服务器响应

内容类型当然是application/json,并注意该id属性实际上_id.

[
  {
    "_id":"55405a5102b4ed623c225e87",
    "alias":"mikeTest",
    "__v":0,
    "scans":[],
    "createdAt":"2015-04-29T04:13:05.223Z"
  }
]
Run Code Online (Sandbox Code Playgroud)

错误信息

请注意,堆栈跟踪的一部分指向我的源,仅指向Ember源.这让调试很痛苦.

Error while processing route: leader Cannot read property 'match' of undefined TypeError: Cannot read property 'match' of undefined
    at Ember.DefaultResolver.extend.podBasedComponentsInSubdir (http://localhost:4200/assets/vendor.js:60138:76)
    at http://localhost:4200/assets/vendor.js:60190:34
    at Array.exports.default.mixin.Mixin.create.find (http://localhost:4200/assets/vendor.js:39572:30)
    at Ember.DefaultResolver.extend.findModuleName (http://localhost:4200/assets/vendor.js:60188:44)
    at resolveOther (http://localhost:4200/assets/vendor.js:60051:37)
    at superWrapper (http://localhost:4200/assets/vendor.js:28141:20)
    at exports.default.EmberObject.default.extend.resolve (http://localhost:4200/assets/vendor.js:15454:35)
    at Object.resolve [as resolver] (http://localhost:4200/assets/vendor.js:15217:23)
    at resolve (http://localhost:4200/assets/vendor.js:12792:29)
    at Object.Registry.resolve (http://localhost:4200/assets/vendor.js:12336:21)
Run Code Online (Sandbox Code Playgroud)

资源

这个ember app很年轻,所以目前来源很少,但这是目前所有相关的来源.

路线

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

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

export default Router.map(function() {
  this.resource('leader');
  this.resource('profile');
  this.route('loading');
});
Run Code Online (Sandbox Code Playgroud)

领导路线

Leader有一个模板和一个控制器,但它们现在基本上是空的.

import Ember from 'ember';

export default Ember.Route.extend({
  model: function () {
    return Ember.RSVP.hash({
      players: this.get('store').find('player')
    });
  },
});
Run Code Online (Sandbox Code Playgroud)

球员模型

import DS from 'ember-data';

export default DS.Model.extend({
  alias: DS.attr('string'),
  createdAt: DS.attr('date'),
  scans: DS.hasMany('scan'),
});
Run Code Online (Sandbox Code Playgroud)

应用适配器

import DS from 'ember-data';


export default DS.RESTAdapter.extend({
  namespace: ''
});
Run Code Online (Sandbox Code Playgroud)

应用程序串行器

import DS from 'ember-data';

export default DS.RESTSerializer.extend({
  primaryKey: function (type) {
    return '_id';
  },

  serializeId: function(id) {
    return id.toString();
  }
});
Run Code Online (Sandbox Code Playgroud)

版本

我不确定这里的任何版本是否特别重要

  • ember-cli0.2.3
  • ember-data1.0.0-beta.16.1
  • ember1.11.1

我尝试过的事情

  • 从模型中删除属性,如果关系似乎是问题(没有改变)
  • 尝试为应用程序设置一个序列化程序和适配器(包含在上面),没有任何改变.
    • 如果id响应中的字段实际上是串行器_id.
  • 尝试更新ember数据,没有任何改变.

aks*_*kst 7

好吧我发现错误是什么......我忘了检查服务器返回的数据是否遵守使用ember数据所需的约定/协议.该JSON服务器返回的是这样的.

[
  {
    "_id":"55405a5102b4ed623c225e87",
    "alias":"mikeTest",
    "__v":0,
    "scans":[],
    "createdAt":"2015-04-29T04:13:05.223Z"
  }
]
Run Code Online (Sandbox Code Playgroud)

它应该看起来像这样

{
  "players": [
    {
      "_id":"55405a5102b4ed623c225e87",
      "alias":"mikeTest",
      "__v":0,
      "scans":[],
      "createdAt":"2015-04-29T04:13:05.223Z"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

所以是的,这是我愚蠢和失踪的东西.

为什么这是必需的

Ember数据期望从服务器返回的JSON符合JSON API标准,该标准指定从服务器返回的JSON的格式.在这种情况下,数据不符合JSON API标准,因为我忘了将玩家数组放在一个名为的密钥下players.在Ember v1.10.0模型指南中还有更多这方面的例子.

Ember Data期望这样的原因是Ember Data可以对服务器返回的数据做出某些假设.