Денормализовать обратный процессСтратегия

У меня есть API, который выдает такие данные с атрибутами в свойстве fields.

{
records: [
    {
    id: "123",
    fields: {
        author: {
        id: "1",
        name: "Paul"
        },
        title: "My awesome blog post",
        comments: [
        {
            id: "324",
            commenter: {
            id: "2",
            name: "Nicole"
            }
        }
        ]
    }
    }
]
};

При нормализации я сейчас справляюсь с этим простым processStrategy: (input, parent, key) => input.fields но я бы хотел еще раз денормализовать это, чтобы денормализованные сущности содержали эту структуру полей, потому что API ожидает этого таким образом.

Пока что денормализуем мои нормализованные данные с const denormalizedData = denormalize([123], [article], normalizedData.entities) опускает поле:

[
{
    "author": {
    "id": "1",
    "name": "Paul"
    },
    "title": "My awesome blog post",
    "comments": [
    {
        "id": "324",
        "commenter": {
        "id": "2",
        "name": "Nicole"
        }
    }
    ]
}
]   

Я не могу найти ничего в API документации о том, как добавить дополнительную обработку при денормализации, любая идея?

0 ответов

Потому как processStrategyпредназначен для предварительной обработки данных в процессе нормализации, он не будет выполняться во время денормализации. В вашем случае я бы не стал использовать эту функцию и просто структурирую ваши схемы следующим образом:

const { schema, denormalize, normalize } = normalizr;
const user = new schema.Entity("users");
const comment = new schema.Entity("comments", { commenter: user });
const commentList = [comment];
const post = new schema.Entity("posts", {
  fields: { author: user, comments: commentList }
});
const postList = [post];
const mockApiResponse = {
  records: [
    {
      id: "123",
      fields: {
        author: {
          id: "1",
          name: "Paul"
        },
        title: "My awesome blog post",
        comments: [
          {
            id: "324",
            commenter: {
              id: "2",
              name: "Nicole"
            }
          }
        ]
      }
    }
  ]
};

const normalizedResponse = normalize(mockApiResponse.records, postList);
const denormalizedResponse = denormalize(
  normalizedResponse.result,
  postList,
  normalizedResponse.entities
);

console.log("normalizedResponse", normalizedResponse);
console.log("denormalizedResponse", denormalizedResponse);

Это даст вам результат, который вы ищете. Если по какой-то причине вам нужно придерживаться текущей реализации, я бы рекомендовал реализовать преобразование в вашем запросе перед отправкой его обратно на сервер. В качестве примера,axios решает это с их transformRequest особенность.

Другие вопросы по тегам