javascript - Ember 断言失败 : The response from a findQuery must be an Array, 未定义

标签 javascript json api rest ember.js

正如标题所示,我收到的错误是:

Error while processing route: index Assertion Failed: The response from a findQuery must be an Array, not undefined

我检查了每个SO答案(例如 this onethis one ),我可以找到与我类似的错误,并且提供的解决方案都没有帮助我解决我的问题。

我正在学习 Ember 并尝试使用 Ember Data RESTAdapter 和 RESTSerializer 来修复来自 OMDB API 的 JSON 响应.

我收到的错误的大多数答案都表明 JSON 格式错误(例如未驼峰化的属性名称),但我很确定在 MovieSerializer.extractArray 中序列化 JSON 的方式没有任何问题。

我尝试添加 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);
    }
});

最佳答案

好的,我找到了错误源。

我忘记返回 extractArray 中的数组。

我所做的更改很简单:

extractArray: function(store, type, payload) {
    // ...
    return this._super(store, type, payload); // added this return statement
}

对于其他查看此问题的人来说,还有一件事需要注意。如果没有特殊需要,不要覆盖 normalizeextractArray 等内置钩子(Hook),并确保满足这些钩子(Hook)的必要条件(例如返回值、调用 super 等)

关于javascript - Ember 断言失败 : The response from a findQuery must be an Array, 未定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27827451/

相关文章:

javascript - 使用 javascript 限制 li 标签

javascript - 即使删除了描边,SVG 动画中仍保留线条

javascript - 脚本 438 : Object doesn't support property or method 'forEach'

regex - 使用 perl 将 XML 转换为 JSON

android - 未经授权的 API 调用 - 保护并只允许注册的前端应用

javascript - PHP-等待值存储在 mySQL 中

javascript - 修复了 Highcharts Stock 中的 x 轴(停止自动缩放)

javascript - d3 森伯斯特硬编码数据

api - 什么是 "pluggable"API?

api - 无法在 Oauth 中获取访问 token 链接