Денормализовать обратный процессСтратегия
У меня есть 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
особенность.