Ember: 来自 findQuery 的响应必须是一个数组,而不是未定义的

Ember: The response from a findQuery must be an Array, not undefined

我正在尝试通过调用 API /search?q=test 来实现搜索功能。 API returns 以下对象:

{
    "categories" : 
    [
        {
            "id" : 77,
            "name" : "Animals",
            "output" : {}
        }, 
        {
            "id" : 167,
            "name" : "Fish",
            "output" : {
                "image" : {
                    "mimeType" : "image/png",
                    "path" : "/images/fish.png"
                }
            }
        }
    ],
    "designs" : []
    // more arrays here
}

这是我的 Ember search 模型:

export default DS.Model.extend({
  categories: DS.hasMany('category'),
  designs: DS.hasMany('design')
  // more hasMany relationships here
});

search 控制器中:

model: function (params) {
  return this.store.find('search', { q: params.q });
}

收到此错误 "Assertion Failed: The response from a findQuery must be an Array, not undefined"。

我是 Ember 的新手,但我觉得我还需要添加一个 search 序列化程序,但不确定在其中写入什么。或者也许还有其他原因导致了这种情况。在我看来它应该工作正常但事实并非如此。有什么建议吗?

model: function (params) {
  return this.store.find('search', { q: params.q });
}

这告诉 ember-data 你想要找到 search 个对象。所以它期望那些在数组中而不是 categories

您可以使用适配器上的 pathForType 函数为类型指定路径:

App.ApplicationAdapter = DS.RESTAdapter.extend({
  pathForType: function(type) {
    if (type == 'category') {
      return 'search';
    }
    var decamelized = Ember.String.decamelize(type);
    return Ember.String.pluralize(decamelized);
  }
});

这意味着当您要求这样做时:this.store.find('category', { q: params: q });

它将向 /search?q=param

发出请求

这一切都是根据文档

likely to change in the future

赞成此 rfc:https://github.com/emberjs/rfcs/pull/4 这将使您能够为特定操作更改 url。

使用给定的代码,您尝试找到一些(读取:一组)搜索。回复中缺少此内容,因此出现错误。

你真正想要的是

model: function (params) {
  return this.store.find('category', { q: params.q });
}

但这会导致对 /categories?q=test 的请求。如果服务器代码和接口完全由您自己控制,请更改服务器。如果没有,您可以使用自定义 RESTAdapter(在 ember-cli: ember g adapter category 中)和自定义 pathForType 方法。

对于那些感兴趣的人,我最终使用了 ajax 调用,而不必依赖 Ember 数据和模型。这是我想出的解决方案:

model: function (params) {
  var route = this;
  return Ember.$.ajax({
    url: ENV.apiHost + '/search?q=' + params.q,
    type: 'GET'
  }).then (function(result) {
    var searchObject = Ember.Object.create({
      categories: Ember.ArrayProxy.create({ content: Ember.A(result.categories) }),
      designs: Ember.ArrayProxy.create({ content: Ember.A(result.designs) }),
      // more arrays here
    });

    return {
      model: searchObject
    };
  });
},