第 7 部分 - 序列化器

Mirage 还具有一个序列化器层,可以帮助你模拟通常应用于 API 的各种转换,例如你的 JSON 对象键是驼峰式还是蛇形式,或者相关数据如何在响应中包含。

我们的提醒应用程序还有一个功能,我们之前没有看到,因为我们模拟响应的方式。 “全部”屏幕上的提醒实际上应该显示它们所属的列表(如果有)。

为了使这能够正常工作,我们的应用程序期望对 /api/reminders 的 GET 请求返回每个提醒的列表,并将其嵌入其中,如下所示

// GET /api/reminders
{
  "reminders": [
    { "id": "1", "text": "Walk the dog" },
    { "id": "2", "text": "Take out the trash" },
    { "id": "3", "text": "Work out" },
    { "id": "4", "text": "Do taxes", "list": { "name": "Home", "id": "1" } },
    { "id": "5", "text": "Visit bank", "list": { "name": "Work", "id": "2" } }
  ]
}

序列化器利用 Mirage 的数据层来帮助你模拟像这样复杂的 API 响应。 让我们看看如何操作。

我们将导入 RestSerializer,将其设置为提醒模型的序列化器,并告诉它嵌入任何相关的列表

import {
  createServer,
  Model,
  hasMany,
  belongsTo,
  RestSerializer,
} from "miragejs"

export default function () {
  createServer({
    serializers: {
      reminder: RestSerializer.extend({
        include: ["list"],
        embed: true,
      }),
    },

    // rest of server
  })
}

这个新的 serializers 键是一个选项,它允许我们在每个模型的基础上定义序列化器。 如果我们想要对所有响应应用一般转换,我们也可以设置一个 application 序列化器。

我们正在使用的 RestSerializer 类是 Mirage 中包含的三个命名序列化器之一,并且是许多 REST API 的良好起点。 还有为类似 Rails 的 API 提供的 ActiveModelSerializer,以及为遵循 JSON:API 规范的 API 提供的 JSONAPISerializer

最后,我们对 RestSerializer 添加了两个自定义项。

首先,include: ['list'] 告诉 Mirage 每次它在路由处理程序的响应中遇到 Reminder 模型时,它应该包含其关联的 List(如果有)。

其次,embed: true 告诉 Mirage *如何* 序列化包含的资源。 默认情况下,它们是侧加载的,但这个 API 期望它们被嵌入,如上面的 JSON 代码片段所示。

添加了这些更改后,如果你在 “全部” 页面上刷新你的应用程序,你应该会在属于列表的提醒旁边看到列表标签

Failing request

尝试使用 UI 为特定列表创建更多提醒,然后返回到 “全部”。 标签应该会显示在你的新数据中。

要点

  • Mirage 的序列化器层可以用来转换你的 JSON 负载
  • 一些常见的序列化器问题包括更改 JSON 负载的形状(例如,是否在根目录中包含键)、复合词格式化的约定(例如,驼峰式 vs. 蛇形式)以及何时以及如何包含相关数据