首页 > 解决方案 > 将复杂的普通对象转换为领域对象?

问题描述

我正在尝试将接收到的纯 JavaScript 对象直接转换和/或传递给领域对象,但我在这样做时遇到了麻烦。

“设置” - 接收到的普通对象(领域对象转换为 Json 并返回)

realm.create('Settings', {
    Id: settings.Id,
    User: settings.User,
    FavoriteChannels: settings.FavoriteChannels,
}, true)

这是一个简单的示例架构:

exports.Settings = {
    name: 'Settings',
    primaryKey: 'Id',
    properties: {
        Id: 'string',
        User: 'User',       
        FavoriteChannels: 'Channel[]',
    }
};

exports.User = {
    name: 'User',
    primaryKey: 'Id',
    properties: {
        Id: 'string',
        FirstName: 'string?',
        LastName: 'string?',            
        PhoneNumbers: 'PhoneNumber[]'           
    }
};

exports.PhoneNumber = {
    name: 'PhoneNumber',
    primaryKey: 'Id',
    properties: {
        Id: 'string',        
        Number: 'string',
    }
};

exports.Channel = {
    name: 'Channel',
    primaryKey: 'Id',
    properties: {
        Id: 'string',           
        ChannelName: 'string?',         
        Users: 'User[]',            
    }
};  

如果我尝试直接在“realm.create”中传递“设置”,我会收到以下错误:

"User.PhoneNumbers必须是类型'PhoneNumber[]',得到'object' ([object Object])

它需要一个数组,但是普通对象的集合被反序列化为对象/字典?(例如。。PhoneNumbers: { '0': [Object] })反序列化器无法知道如何解析领域对象"List {}"(例如[PhoneNumbers]: List { [0]: [Object] })数组。

Realm 似乎对这些操作缺乏“对称性”,除非我遗漏了一些东西。

标签: javascriptjsonnode.jsrealm

解决方案


解决它的一种方法是在客户端简单地使用对象构造函数,例如:

//file "dataModel.js"
export function Settings(obj) {
    this.Id = obj.Id;
    this.User = new User(obj.User); //check for null, if property in the schema is nullable, so you don't pass empty objects to Realm - example: obj.User ? new User(obj.User) : null;
    this.FavoriteChannels = Object.values(obj.FavoriteChannels).map(m => new Channel(m));
}

export function User(obj) {
    this.Id = obj.Id;
    this.FirstName = ojb.FirstName;
    this.LastName = obj.LastName;
    PhoneNumbers = Object.values(obj.PhoneNubmers).map(m => new PhoneNumber(m));
}

export function PhoneNumber(obj) {
    this.Id = obj.Id;
    this.Nubmer = obj.Number;
}

export function Channel(obj) {
    this.Id = obj.Id;
    this.ChannelName = obj.ChannelName;
    this.Users = Object.values(obj.Users).map(m => new User(m));
}


//file app.js
import * as dataModel from 'path-to-dataModel';
...
//receive data from server and create Settings using the constructor from dataModel
const testObj = new dataModel.Settings(plainSettingsObjectFromServer);  
//make any changes to the testObj and send it back to server

现在我们可以将从客户端接收到的普通对象传递给 Realm.Create:

realm.create('Settings', {
    Id: plainSettingsObject.Id,
    User: plainSettingsObject.User,
    FavoriteChannels: plainSettingsObject.FavoriteChannels,
}, true)

推荐阅读