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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 07:05:14