5

オブジェクトを文字列化してクライアントに送信する前に、mongoose クエリから結果 (オブジェクト) を取得していて、いくつかのキーを置換/削除したいと考えています。

オブジェクトをコンソールログに記録すると、すべてがうまくいきます(すべてのキーがリストされ、それ以上のものはありません)。オブジェクトに対して for..in を実行すると、非表示のフィールドがどこからともなくポップアップします (対象のキーはポップアップしません)。それらは理にかなっています-それらはマングースに属しています-しかし、私はそれらを望んでいません。オブジェクトで Object.keys または Object.getOwnPropertyNames を使用すると、同じことが起こります - 隠しフィールドのポップアップは役に立ちません。

そこで、util.inspect(obj,true,null,true) を使用して要素を検査し、結果をコンソールに記録したいと考えました。コンソールでの結果は同じで、検査なしでオブジェクトを直接 console.logged したかのようです。

では、2 つの質問があります。

  1. オブジェクトに関する内部/非表示の情報を実際に取得するために、オブジェクトを正しく検査するにはどうすればよいですか?
  2. オブジェクトを反復処理してフィールドのみを取得するにはどうすればよいですか? (はい、for..in ループ内で hasOwnProperty チェックを行っています)

//編集

はい、分かりました。いくつかの調査の後、mongoose オブジェクトがそのプロパティをプロキシし、toJSON 関数を持っていることがわかりました。これは、console.logs が予期された出力構造にある理由を説明しています。解決策は、Mongoose 独自の toObject メソッドを使用することです。

mongooseObj.toObject({ getters: true, virtuals: false })

このようにして、Object.getOwnPropertyNames を反復処理し、クライアントに知られたくないキーを置換/削除できます。

4

2 に答える 2

4

本当にデータを見たいだけなのに、マングース クエリによって返されたDocumentオブジェクトを見ていると思います。私の推測が正しければ、おそらく次のようなものが必要になるでしょう。

Model.findOne({ name: 'john' }, function (err, doc) {
    var data = doc.toObject();

    // do whatever you need to with data
    delete data.age;
    delete data.weight;
    data.isAwesome = true;

    // now stringify the data and do something with it
    callback(JSON.stringify(data));
});
于 2012-03-10T01:17:25.880 に答える