Mirage服务器GET正常但POST失败,如何识别capitol_city关联?
解决Mirage POST创建Country时
capitol_city关联不被识别的问题 定义的模型与序列化器
Country模型 (mirage/models/country.js)
import { Model, belongsTo, hasMany } from 'miragejs'; export default Model.extend({ name: '', iso3166_1_alpha3: '', capitol_city: belongsTo('city', {inverse: null}), cities: hasMany('city', {inverse: 'country'}) });
City模型 (mirage/models/city.js)
import { Model, belongsTo } from 'miragejs'; export default Model.extend({ name: '', country: belongsTo('country', {inverse: 'cities'}) });
应用序列化器 (mirage/serializers/application.js)
import { camelize, capitalize, underscore } from '@ember/string'; import { JSONAPISerializer } from 'miragejs'; export default class ApplicationSerializer extends JSONAPISerializer { alwaysIncludeLinkageData = true; keyForAttribute(attr) { return underscore(attr); }; keyForRelationship(modelName) { return underscore(modelName); }; typeKeyForModel(model) { return capitalize(camelize(model.modelName)); }; };
问题现象
GET请求获取Country的测试可以正常通过,但POST请求创建Country时测试失败,抛出错误:
Mirage:你通过POST请求
/api/countries向country模型传递了关联capitol_city,但你没有在country模型上定义capitol_city关联。
解决方案
问题核心在于序列化器的keyForRelationship方法与模型关联命名的映射不匹配,以下是两种直接修复方式:
修复方案一:调整keyForRelationship方法逻辑
模型中关联已使用下划线命名(capitol_city),但keyForRelationship默认会对传入的驼峰格式关联名再次转下划线,导致Mirage无法匹配到模型上的关联定义。修改方法如下:
keyForRelationship(modelName) { // 模型关联已是下划线命名,直接返回无需二次转换 return modelName; };
如果存在驼峰/下划线混合的关联场景,可改为条件判断:
keyForRelationship(modelName) { // 已有下划线的关联直接返回,否则转下划线格式 return modelName.includes('_') ? modelName : underscore(modelName); };
修复方案二:显式配置关联键映射
在序列化器中通过attrs属性,明确指定capitol_city关联的键映射规则:
export default class ApplicationSerializer extends JSONAPISerializer { alwaysIncludeLinkageData = true; attrs = { capitolCity: { key: 'capitol_city' } }; keyForAttribute(attr) { return underscore(attr); }; keyForRelationship(modelName) { return underscore(modelName); }; typeKeyForModel(model) { return capitalize(camelize(model.modelName)); }; };
这里capitolCity是Mirage内部引用关联的驼峰名称,key: 'capitol_city'指定了请求中使用的下划线键名。
额外检查项
- 确保POST请求的payload符合JSON:API规范,
capitol_city关联需放在relationships字段下:{ "data": { "type": "Countries", "attributes": { "name": "测试国家", "iso3166_1_alpha3": "TST" }, "relationships": { "capitol_city": { "data": { "type": "Cities", "id": "1" } } } } } - 确认Mirage路由的POST处理逻辑正确,允许传入关联数据:
this.post('/api/countries', (schema, request) => { let attrs = JSON.parse(request.requestBody).data; return schema.countries.create(attrs); });
内容的提问来源于stack exchange,提问作者MT0
相关产品推荐
相关产品推荐

