3

私は次のように構築されたマングースユーザースキーマを持っています:

var UserSchema = new Schema({
    username: { type: String, required: true, index: { unique: true } },
    password: { type: String, required: true },
    salt: { type: String, required: true}
});

このユーザー オブジェクトをアプリケーションのクライアント側に送信できるようにしたいのですが、パスワードやソルト フィールドを無視したくありません。

そこで、ユーザーモデルモジュールに次のコードを追加しました

serSchema.methods.forClientSide = function() {
    console.log('in UserSchema.methods.forClientSide');
    console.log(this);
    //var userForClientSide=_.omit(this,'passsword','salt');
    var userForClientSide={_id:this._id, username:this.username };
    console.log(userForClientSide);

    return userForClientSide;
}

requiredアンダースコア モジュールがあります (package.js の依存関係を介してローカルにインストールされます)。

コメントアウトされた行ではありません-ユーザーオブジェクトのパスワードとソルトフィールドを省略することを期待していましたが、何もしませんでした:(ログに記録されたオブジェクトにはプロパティの完全なセットがありました.

現在使用されているものに置き換えると、必要なvar userForClientSide={_id:this._id, username:this.username };結果が得られますが、

1) うまくいかない理由を知りたい_.omit。2)現在の回避策はあまり好きではありません。気に入らないプロパティを省略するのではなく、実際にいくつかのプロパティを選択するためです。新しいプロパティをスキーマに追加する場合は、ここにも追加する必要があります。

これは、node.js/express/mongodb/mongoose などを使用して何かを書く最初の試みです。そのため、この問題に対する他のより良い解決策 (おそらく mongoose の機能) を見逃している可能性が非常に高いです。このようなことをする正しい方法。

基本的に、これを行う正しい方法と、なぜ私の方法がうまくいかなかったのかを知りたいです。

ありがとう

4

1 に答える 1

12

1) _.omit が機能しない理由を知りたい。

Mongoose の使用definePropertyといくつかの重いメタプログラミング。アンダースコアを使用する場合は、最初に呼び出しuser.toJSON()て、メタプログラミングの空想や関数などをすべて使用せずに、アンダースコアでより適切に機能するプレーンな古い JavaScript オブジェクトを取得します。

より良い解決策は、mongo/mongoose のfieldsオブジェクトを使用して文字列を渡すこと"-password -salt"です。そのため、mongo からこれらを取得することをまったく省略します。

もう 1 つの方法は、mongoose Transformを使用することです (そのページで「tranform」を検索してください)。あなたのユースケースは、ドキュメントが例として使用する正確なユースケースです。

クエリを呼び出すことで、マングース クエリを「リーン」にすることもできます.lean()。その場合、マングース モデル インスタンスではなく、プレーンな JavaScript オブジェクトが返されます。

ただし、これらのことをそれぞれ試した後、私は個人的にAccount、ログインの詳細とコレクションを持つ別のコレクションが必要であるという意見Userに達しました。上記が動作します。

于 2013-07-31T21:29:17.740 に答える