2017-01-19 13 views
0

Я только что обновил до normalizr версии 3.1.x, чтобы использовать денормализацию. Хотя они значительно изменили свой API. У меня возникли проблемы с переносом моих схем.Ошибка при преобразовании схемы из Normalizr v2 в v3

import { normalize, Schema, arrayOf, valuesOf } from 'normalizr'; 

const usersSchema = new Schema('users') 
const photosSchema = new Schema('photos') 
const phonesSchema = new Schema('phones') 

photosSchema.define({ 
    users: arrayOf(usersSchema) 
}) 

phonesSchema.define({ 
    users: arrayOf(usersSchema) 
}) 

usersSchema.define({ 
    photos: valuesOf(photosSchema), 
    phones: valuesOf(phonesSchema) 
}) 

Это была моя существующая схема для пользователей. Я также использую redux-normalizr middleware внутри моей Redux действия, поэтому я подключил схему для моего действия, как это:

import { usersSchema } from '../normalizrSchemas/usersSchemas.js' 
import { arrayOf } from 'normalizr' 

export function getUsers(data) { 
    return { 
    type: 'GET_USERS', 
    payload: data, 
    meta: { 
     schema : arrayOf(usersSchema) 
    } 
    } 
} 

Это была моя первая попытка преобразовать схему более. Кажется, вы не можете вызвать schema.Array так же, как вы могли бы использовать arrayOf, поэтому мне показалось, что мне нужно переместить вызов массива в схему.

import { schema } from 'normalizr'; 

const photos = new schema.Entity('photos') 
const phones = new schema.Entity('phones') 
const user = new schema.Entity('user', { 
    photos: [photos], 
    phones: [phones] 
}) 

const users= new schema.Array('users', user) 

export { users } 

действие такое же, но я удалил обертку схемы в arrayOf. Все данные пользователей просто сбрасываются в результаты без какой-либо нормализации. Данные представляют собой список объектов пользователя, и каждый объект содержит идентификатор, который normalizr должен забрать. Я изо всех сил пытаюсь понять, как добиться нормализации идентификации, что это массив объектов, которые я думаю.

ответ

2

schema.Array не принимает имя ключевой строки (docs). Первым аргументом должно быть определение схемы. Таким образом, вместо

const users= new schema.Array('users', user) 

Вы должны использовать:

const users = new schema.Array(user) 

Или вы могли бы просто использовать сокращенную для массива одного типа объекта:

const users = [ user ]; 
+0

СММ. он sems ему не понравилось сокращение, выплевывая 'index.js: 179 Uncaught Error: Normalize принимает объект для schema.'. Хотя он принял длинную форму 'new schema.Array (provider)'. Тем не менее, все пользовательские объекты все еще сбрасываются в массив результатов, а сущности пусты. Я устал, чтобы упростить свой код, удалив фотографии и телефоны. Может быть, я найду дополнительную информацию в документах. – DigitalDisaster

+0

Ну, похоже, может быть, только что redux-normalizr просто не совместим с версией 3. При использовании 'normalize' в моем редукторе со схемой работает нормально. Жаль, что мне нужно избавиться от промежуточного ПО, но я очень рад использовать normalizr v3! Спасибо! – DigitalDisaster