插入对象mongodb的私有变量

时间:2016-05-12 11:20:03

标签: node.js mongodb typescript

我正在使用以下环境

  

NodeJS:5.7.1

     

Mongo DB:3.2.3

     

MongoDB(NodeJS驱动程序):2.1.18

     

TypeScript:1.8

我使用Typescript创建了一个Object作为

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 = "foo@bar.com";
db.collection('users').insertOne(user)
.then(function(r){..}).catch(function(e){..});

当我从mongo控制台查询时,检查插入的值,使用 db.users.find({}).pretty();

它给了我以下输出。

{
"_name":"Foo",
"_email":"foo@bar.com",
"name":"Foo",
"email":"foo@bar.com"
}

为什么要存储私有变量?如何防止它存储私有变量。

编辑:1 既然,我无法停止开发应用程序,我暂时使用了一种解决方法。域对象现在有一个额外的方法toJSON,它提供了我希望存储在MongoDB中的结构。 e.g。

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

我也在组合对象上调用toJSON()

1 个答案:

答案 0 :(得分: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())