2016-05-12 4 views
1

Я использую следующую средуВставка частных переменных объекта MongoDB

NodeJS: 5.7.1

Монго DB: 3.2.3

MongoDB (NodeJS Driver): 2.1.18

Тип текста: 1.8

Я создал объект с использованием типов cript в

class User { 
    private _name:string; 
    private _email:string; 
    public get name():string{ 
    return this._name; 
    } 
    public set name(val:string){ 
    this._name = val; 
    } 
    public get email():string{ 
    return this._email; 
    } 
    public set email(val:string){ 
    this._email = val; 
    } 
} 

Использование драйвера MongoDB API, я пытаюсь вставить объект как

var user:User = new User(); 
user.name = "Foo"; 
user.email = "[email protected]"; 
db.collection('users').insertOne(user) 
.then(function(r){..}).catch(function(e){..}); 

Когда я запрос от Монго консоли, чтобы проверить значения, вставленные, используя db.users.find({}).pretty();

это дает меня следующий выход.

{ 
"_name":"Foo", 
"_email":"[email protected]", 
"name":"Foo", 
"email":"[email protected]" 
} 

Почему частные переменные хранятся? Как я могу помешать ему хранить частные переменные.

EDIT: 1 Поскольку я не мог прекратить разработку приложения, я использовал обходное решение на данный момент. Объект домена теперь имеет дополнительный метод toJSON, который предоставляет структуру, которую я хочу сохранить в MongoDB. , например.

public toJSON():any{ 
return { 
"name":this.name 
...//Rest of the properties. 
}; 
} 

Я звоню toJSON() на сложенном объекте.

+2

Частная переменная совпадает с общедоступными переменными при компиляции в js по причине производительности. http://stackoverflow.com/questions/12713659/typescript-private-members – Zen

+0

Итак, каков рекомендуемый подход для вставки только общедоступных переменных? – CuriousMind

ответ

1

Чтобы действительно контролировать вещи, я предлагаю иметь метод в каждом из ваших устойчивых объектов, который возвращает данные, которые вы хотите сохранить для этого объекта. Например:

class User { 
    private _name: string; 
    private _email: string; 

    public get name(): string{ 
     eturn this._name; 
    } 

    public set name(val: string) { 
     this._name = val; 
    } 

    ublic get email(): string{ 
     return this._email; 
    } 

    public set email(val: string){ 
     this._email = val; 
    } 

    public getData(): any { 
     return { 
      name: this.name, 
      email: this.email 
     } 
    } 
} 

Вы, наверное, больше, чем просто User, что вы хотите, чтобы сохраняться, вы можете сделать вещи немного более общий характер:

interface PersistableData {} 

interface Persistable<T extends PersistableData> { 
    getData(): T; 
} 

interface UserPersistableData extends PersistableData { 
    name: string; 
    email: string; 
} 

class User implements Persistable<UserPersistableData> { 
    // ... 

    public getData(): UserPersistableData { 
     return { 
      name: this.name, 
      email: this.email 
     } 
    } 
} 

Вы тогда просто сделать:

db.collection('users').insertOne(user.getData()) 
+0

Я сделал то же самое, после размещения вопроса. – CuriousMind

Смежные вопросы