使用 normalizr 标准化 api 响应

Normalize api response with normalizr

因此,当您请求资产时,端点会以类似这样的方式进行响应。 Bios只是一个例子。

{
  _embedded: {
    bios: [
      {
        name: 'Blorp Gorp',
        id: 256,
        _links: {},
        arrayCollection: [...],
        objectCollection: [...],
        ...
      },
      ...
    ],
  _links: {},
}

我想把它扁平化成类似的东西,我什至不确定这是否有意义:

{
  results: [256, 257],
  entities: {
    bios: {
      256: {...},
      257: {...}
    },
    arrayCollection: {
      256: [...],
      257: [...]
    },
    objectCollection: {
      256: {...},
      257: {...}
    }
  }
}

但是我无法让模式在它们到达实体之前识别任何嵌套。如果我传递 normalize(camelizedJson.embedded.bios, bioSchema),它会起作用,但如果我传递它 normalize(camelizedJson.embedded, bioSchema),我无法意识到我想解析 bios.

我想我可以将另一个变量传递给中间件,为它提供成功解析的嵌入式密钥。

我认为您需要创建一个架构来定义(此处为示例的假名称)"MyArrayThing" 和 "MyObjectThing",然后在 "Bio" 架构定义中,定义 "arrayCollection" 和 "objectCollection" 子字段使用 Normalizr 的 arrayOf(SomeSchemaObject) 函数。然后,一旦您定义了单个 Bio 对象的外观,您的解析命令也需要大致类似于 normalize(camelizedJson.embedded.bios, arrayOf(Bio)).

But I can't get the Schemas to recognize any nesting before they hit their entity. if I pass normalize(camelizedJson.embedded.bios, bioSchema), it works, but if I pass it normalize(camelizedJson.embedded, bioSchema) I can't get it realize I want to parse the bios.

您可能需要 normalize(camelizedJson.embedded, { bios: bioSchema })。模式可以嵌套在普通 JavaScript 对象中,例如:

normalize(camelizedJson.embedded, {
  bios: bioSchema,
  lols: lolSchema,
  wow: arrayOf({
    wat: {
      ugh: ughSchema
    }
  })
})