4

Expressとノードでマングースを使用してRESTAPIを作成しています。新しいオブジェクトを保存したら、そのオブジェクトをユーザーに返したいと思います。ただし、パスワード、クレジットカードの詳細、権限、請求履歴など、一部の機密フィールドは返送しないでください。

.selectに相当するものがあり、フィールドのサブセットだけを選択してユーザーに返すことができると思いました。ただし、これは存在しないようです。「標準」は、次のように、ユーザーに返したくないフィールドを削除することだけです。

  org.save(function(err, org) {
    if (err) return handleError(err, res);
    orgobj = org.toObject();
    delete orgobj.__v;
    delete orgobj._id;
    delete orgobj.billing;
    delete orgobj.plans;
    delete orgobj.permissions;
    return res.send(orgobj);
  });

より効率的な方法はありますか?後でフィールドが追加された場合、誰かがそれを具体的に削除することを忘れないようにする必要があるため、これは好きではありません。また、パフォーマンス上の理由から、フィールドを「再選択」したくありません。

4

2 に答える 2

12

getPublicFieldsパブリックフィールドを厳密に含むオブジェクトを返すメソッドを追加できます。

orgSchema.methods.getPublicFields = function () {
    var returnObject = {
        name: this.name,
        address: this.address,
        randomField: this.randomField
    };
    return returnObject;
};

必要に応じて、その関数にコールバックを追加し、他のクエリを実行してデータを集約することもできます。メソッドが完了したら、

var orgPublic = org.getPublicFields();
于 2013-01-07T13:06:32.843 に答える
0

誰かがまだマングースに優しい答えに興味があるなら、以下を見てください。

使用.select(...)すると、マングースのドキュメントにはまだすべてのフィールドがあり、_docプロパティが削減されることがわかります。

新しいドキュメントを保存した後、必要なフィールドを削除することができますnewDoc['_doc']

これで、を使用して、newDoc.toObject()指定した「パブリック」フィールドをプルできます。

以下の例では_.pick()、必要なフィールドのホワイトリストを作成するために使用していますが_.remove()、ブラックリストを作成するためにも使用できます。

publicFileds配列はクエリに使用できるため、CRUDアクションに.select(...)必要な定義は1つだけであることに注意してください。publicFileds

var MyModel = require('./MyModel');
var _ = require('lodash');

var publicFileds = ['_id', 'name', 'age'];

function create(newModelData, cb) {

    var newModle = new MyModel(newModelData);

    newModle.save(function (err, newDoc) {

        if (err) {
            cb(err);
            return;
        }

        newDoc['_doc'] = _.pick(newDoc['_doc'], publicFileds);
        cb(null, newDoc);

    }
}
于 2017-08-01T08:46:15.047 に答える