You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ember Data中normalizeResponse返回无效JSON API文档问题求助

问题分析与解决方案

你的报错源于Serializer处理逻辑不符合JSON API规范:调用findRecord请求单个todo记录时,JSONPlaceholder返回的是单个对象,但你在normalizeResponse里将其包装到了复数键todos中,导致RESTSerializer无法生成正确的顶层对象结构。

修正方案一:动态匹配单数/复数键

修改Serializer代码,根据请求类型决定用单数或复数键包装数据,让RESTSerializer能正确解析:

import RESTSerializer from '@ember-data/serializer/rest';

export default class TodoSerializer extends RESTSerializer {
    normalizeResponse(store, primaryModelClass, payload, id, requestType) {
        // 根据请求类型选择单数/复数键
        const modelKey = requestType === 'findRecord' ? 'todo' : 'todos';
        payload = { [modelKey]: payload };
        // 将修改后的payload传入父类方法
        return this._super(store, primaryModelClass, payload, id, requestType);
    }
}

修正方案二:直接构造标准JSON API结构

手动生成符合JSON API规范的响应文档,跳过RESTSerializer的默认解析逻辑:

import RESTSerializer from '@ember-data/serializer/rest';

export default class TodoSerializer extends RESTSerializer {
    normalizeResponse(store, primaryModelClass, payload, id, requestType) {
        const modelName = primaryModelClass.modelName;
        
        // 处理单个记录请求
        if (requestType === 'findRecord') {
            return {
                data: {
                    id: payload.id.toString(),
                    type: modelName,
                    attributes: {
                        userId: payload.userId,
                        title: payload.title,
                        completed: payload.completed
                    }
                }
            };
        }

        // 处理列表记录请求(可选,若需要支持findAll)
        if (requestType === 'findAll') {
            return {
                data: payload.map(item => ({
                    id: item.id.toString(),
                    type: modelName,
                    attributes: {
                        userId: item.userId,
                        title: item.title,
                        completed: item.completed
                    }
                }))
            };
        }

        return this._super(...arguments);
    }
}

两种方案都能解决“JSON API文档顶层必须是对象”的报错,方案一更贴合RESTSerializer的默认工作流程,方案二则更灵活可控。

内容的提问来源于stack exchange,提问作者GOKULKRISHNAN SELVARAJ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 14:55:20