Ember断言失败:findQuery 的响应必须是一个数组,而不是未定义的
Ember Assertion Failed: The response from a findQuery must be an Array, not undefined
正如标题所说,我得到的错误是:
Error while processing route: index Assertion Failed: The response from a findQuery must be an Array, not undefined
我检查了每一个 SO 答案(比如 this one or this one)我能找到与我类似的错误,并且 none 提供的解决方案帮助我解决了我的问题。
我正在学习 Ember 并尝试使用 Ember Data RESTAdapter 和 RESTSerializer 修复来自 OMDB API 的 JSON 响应。
我得到的错误的大多数答案都建议格式错误的 JSON(例如非驼峰化的 属性 名称),但我很确定我序列化 JSON 的方式没有任何问题在 MovieSerializer.extractArray
.
我已经尝试添加 normalize
方法以及 normalizeHash
但是,如上所述,我找不到无效或丢失的 属性(id
是那里)需要标准化。
JSON 收到:
{
"Title": "Pulp Fiction",
"Year": "1994",
"Rated": "R",
"Released": "14 Oct 1994",
"Runtime": "154 min",
"Genre": "Crime, Drama, Thriller",
"Director": "Quentin Tarantino",
"Writer": "Quentin Tarantino (story), Roger Avary (story), Quentin Tarantino",
"Actors": "Tim Roth, Amanda Plummer, Laura Lovelace, John Travolta",
"Plot": "The lives of two mob hit men, a boxer, a gangster's wife, and a pair of diner bandits intertwine in four tales of violence and redemption.",
"Language": "English, Spanish, French",
"Country": "USA",
"Awards": "Won 1 Oscar. Another 63 wins & 47 nominations.",
"Poster": "http://ia.media-imdb.com/images/M/MV5BMjE0ODk2NjczOV5BMl5BanBnXkFtZTYwNDQ0NDg4._V1_SX300.jpg",
"Metascore": "94",
"imdbRating": "8.9",
"imdbVotes": "1,039,031",
"imdbID": "tt0110912",
"Type": "movie",
"Response": "True"
}
序列化JSON(登录在下面标记的代码部分)
{
"movies": [
{
"id": 1,
"title": "Pulp Fiction",
"year": "1994",
"rated": "R",
"released": "14 Oct 1994",
"runtime": "154 min",
"genre": "Crime, Drama, Thriller",
"director": "Quentin Tarantino",
"writer": "Quentin Tarantino (story), Roger Avary (story), Quentin Tarantino",
"actors": "Tim Roth, Amanda Plummer, Laura Lovelace, John Travolta",
"plot": "The lives of two mob hit men, a boxer, a gangster's wife, and a pair of diner bandits intertwine in four tales of violence and redemption.",
"language": "English, Spanish, French",
"country": "USA",
"awards": "Won 1 Oscar. Another 63 wins & 47 nominations.",
"poster": "http://ia.media-imdb.com/images/M/MV5BMjE0ODk2NjczOV5BMl5BanBnXkFtZTYwNDQ0NDg4._V1_SX300.jpg",
"metascore": "94",
"imdbRating": "8.9",
"imdbVotes": "1,039,031",
"imdbId": "tt0110912",
"type": "movie",
"response": "True"
}
]
}
我的应用程序的相关代码是:
型号
var Movie = DS.Model.extend({
title: DS.attr('string'),
year: DS.attr('string'),
rated: DS.attr('string'),
released: DS.attr('string'),
runtime: DS.attr('string'),
genre: DS.attr('string'),
director: DS.attr('string'),
writer: DS.attr('string'),
actors: DS.attr('string'),
plot: DS.attr('string'),
language: DS.attr('string'),
country: DS.attr('string'),
awards: DS.attr('string'),
poster: DS.attr('string'),
metascore: DS.attr('string'),
imdbRating: DS.attr('string'),
imdbVotes: DS.attr('string'),
imdbId: DS.attr('string'),
type: DS.attr('string'),
response: DS.attr('string')
});
索引路线
var IndexRoute = Ember.Route.extend({
model: function() {
return this.get('store').find('movie', {title: 'Pulp Fiction'}); // calls findQuery in the RESTAdapter
}
});
适配器
var MovieAdapter = DS.RESTAdapter.extend({
// request sent to http://www.omdbapi.com/?t=pulp+fiction&y=&plot=short&r=json
buildURL: function(item) {
var title = item.title.trim().replace(/\s+/, '+').replace(/[A-Z]/g, function(val) {
return val.toLowerCase();
});
return "http://www.omdbapi.com/?t=" + title + "&y=&plot=short&r=json";
}
findQuery: function(store, type, query) {
return this.ajax(this.buildURL(query), 'GET');
}
});
序列化器
var MovieSerializer = DS.RESTSerializer.extend({
extractArray: function(store, type, payload) {
var movies = [{
id: 1 // hard-code an id for now
}];
var camelKey;
for(var key in payload) {
camelKey = Ember.String.decamelize(key).camelize();
movies[0][camelKey] = payload[key];
}
payload = { movies: movies };
console.log(JSON.stringify(payload)); // THE SERIALIZED JSON ABOVE IS LOGGED AT THIS POINT
this._super(store, type, payload);
}
});
好的,所以我找到了错误源。
我忘了 return extractArray
中的数组。
我做的改动很简单:
extractArray: function(store, type, payload) {
// ...
return this._super(store, type, payload); // added this return statement
}
其他看这个问题的人还有一点要注意。不要在没有特定需要的情况下覆盖 normalize
或 extractArray
等内置钩子,并确保满足这些钩子的必要条件(例如 return 值,调用 super
等等)
正如标题所说,我得到的错误是:
Error while processing route: index Assertion Failed: The response from a findQuery must be an Array, not undefined
我检查了每一个 SO 答案(比如 this one or this one)我能找到与我类似的错误,并且 none 提供的解决方案帮助我解决了我的问题。
我正在学习 Ember 并尝试使用 Ember Data RESTAdapter 和 RESTSerializer 修复来自 OMDB API 的 JSON 响应。
我得到的错误的大多数答案都建议格式错误的 JSON(例如非驼峰化的 属性 名称),但我很确定我序列化 JSON 的方式没有任何问题在 MovieSerializer.extractArray
.
我已经尝试添加 normalize
方法以及 normalizeHash
但是,如上所述,我找不到无效或丢失的 属性(id
是那里)需要标准化。
JSON 收到:
{
"Title": "Pulp Fiction",
"Year": "1994",
"Rated": "R",
"Released": "14 Oct 1994",
"Runtime": "154 min",
"Genre": "Crime, Drama, Thriller",
"Director": "Quentin Tarantino",
"Writer": "Quentin Tarantino (story), Roger Avary (story), Quentin Tarantino",
"Actors": "Tim Roth, Amanda Plummer, Laura Lovelace, John Travolta",
"Plot": "The lives of two mob hit men, a boxer, a gangster's wife, and a pair of diner bandits intertwine in four tales of violence and redemption.",
"Language": "English, Spanish, French",
"Country": "USA",
"Awards": "Won 1 Oscar. Another 63 wins & 47 nominations.",
"Poster": "http://ia.media-imdb.com/images/M/MV5BMjE0ODk2NjczOV5BMl5BanBnXkFtZTYwNDQ0NDg4._V1_SX300.jpg",
"Metascore": "94",
"imdbRating": "8.9",
"imdbVotes": "1,039,031",
"imdbID": "tt0110912",
"Type": "movie",
"Response": "True"
}
序列化JSON(登录在下面标记的代码部分)
{
"movies": [
{
"id": 1,
"title": "Pulp Fiction",
"year": "1994",
"rated": "R",
"released": "14 Oct 1994",
"runtime": "154 min",
"genre": "Crime, Drama, Thriller",
"director": "Quentin Tarantino",
"writer": "Quentin Tarantino (story), Roger Avary (story), Quentin Tarantino",
"actors": "Tim Roth, Amanda Plummer, Laura Lovelace, John Travolta",
"plot": "The lives of two mob hit men, a boxer, a gangster's wife, and a pair of diner bandits intertwine in four tales of violence and redemption.",
"language": "English, Spanish, French",
"country": "USA",
"awards": "Won 1 Oscar. Another 63 wins & 47 nominations.",
"poster": "http://ia.media-imdb.com/images/M/MV5BMjE0ODk2NjczOV5BMl5BanBnXkFtZTYwNDQ0NDg4._V1_SX300.jpg",
"metascore": "94",
"imdbRating": "8.9",
"imdbVotes": "1,039,031",
"imdbId": "tt0110912",
"type": "movie",
"response": "True"
}
]
}
我的应用程序的相关代码是:
型号
var Movie = DS.Model.extend({
title: DS.attr('string'),
year: DS.attr('string'),
rated: DS.attr('string'),
released: DS.attr('string'),
runtime: DS.attr('string'),
genre: DS.attr('string'),
director: DS.attr('string'),
writer: DS.attr('string'),
actors: DS.attr('string'),
plot: DS.attr('string'),
language: DS.attr('string'),
country: DS.attr('string'),
awards: DS.attr('string'),
poster: DS.attr('string'),
metascore: DS.attr('string'),
imdbRating: DS.attr('string'),
imdbVotes: DS.attr('string'),
imdbId: DS.attr('string'),
type: DS.attr('string'),
response: DS.attr('string')
});
索引路线
var IndexRoute = Ember.Route.extend({
model: function() {
return this.get('store').find('movie', {title: 'Pulp Fiction'}); // calls findQuery in the RESTAdapter
}
});
适配器
var MovieAdapter = DS.RESTAdapter.extend({
// request sent to http://www.omdbapi.com/?t=pulp+fiction&y=&plot=short&r=json
buildURL: function(item) {
var title = item.title.trim().replace(/\s+/, '+').replace(/[A-Z]/g, function(val) {
return val.toLowerCase();
});
return "http://www.omdbapi.com/?t=" + title + "&y=&plot=short&r=json";
}
findQuery: function(store, type, query) {
return this.ajax(this.buildURL(query), 'GET');
}
});
序列化器
var MovieSerializer = DS.RESTSerializer.extend({
extractArray: function(store, type, payload) {
var movies = [{
id: 1 // hard-code an id for now
}];
var camelKey;
for(var key in payload) {
camelKey = Ember.String.decamelize(key).camelize();
movies[0][camelKey] = payload[key];
}
payload = { movies: movies };
console.log(JSON.stringify(payload)); // THE SERIALIZED JSON ABOVE IS LOGGED AT THIS POINT
this._super(store, type, payload);
}
});
好的,所以我找到了错误源。
我忘了 return extractArray
中的数组。
我做的改动很简单:
extractArray: function(store, type, payload) {
// ...
return this._super(store, type, payload); // added this return statement
}
其他看这个问题的人还有一点要注意。不要在没有特定需要的情况下覆盖 normalize
或 extractArray
等内置钩子,并确保满足这些钩子的必要条件(例如 return 值,调用 super
等等)