1

Node.jsの上でExpressとMongooseを使用してRESTful APIを構築しています

内部使用のみに予約されている特定のフィールド/プロパティをスキーマで使用しています。それらは API ユーザーにはまったく表示されません。

res.send() する前にそれらを削除する最良の方法は何ですか? 各ルート (取得、投稿、更新) ごとに手動で行う必要がありますか、またはそれらを除外する一般的な方法はありますか?

カスタム ミドルウェアを使用しようとしましたが、うまくいきませんでした。使用する前にミドルウェアを配置すると ( app.router )、res.body が定義されず、後で配置すると、ミドルウェアが呼び出されませんでした。また、ミドルウェアでは単一のドキュメントとドキュメントの配列の両方を扱っているため、ドキュメントごとに処理する方法を見つけたいと考えています。

4

3 に答える 3

2

selectスキーマ フィールドの定義の属性を使用して、find呼び出しから返されるオブジェクトに既定で含まれているかどうかを判断できます。falseデフォルトで抑制したいフィールドには に設定します。

T = db.model('T', new Schema({ x: { type: String, select: false }}));
T.find(..); // field x will not be included..
// .. unless overridden;
T.find().select('+x').exec(callback);
于 2012-10-24T21:40:18.583 に答える
1

.populate() を使用できます - item.created_by が User オブジェクトへのスキーマ参照であると仮定すると、2 番目の引数は -fieldname を取ります...

Item.findById(id).populate('created_by', '-salt -password_hash').exec(function(err, item){
 //item.created_by will have user object
 //without salt or password_hash fields.
});
于 2012-10-24T23:36:55.513 に答える
0

もう 1 つの方法は、アプリケーションがオブジェクトを送信する前に呼び出すトリマー/クリーナー関数のセットです。

server.get("/api/user/:userId", function(req, res, next){
    var id = req.params.userId;
    User.findById(id, function(err, doc){
        if(err){
            return next(err);
        }
        sendUtils.sendUser(req, res, doc);
    });
});


sendUtils.sendUser = function(req, res, doc){
    res.send(_.omit(doc, ['__id', 'hiddenfield', 'hiddenfield2']);
}

(underscore.jsの省略機能を利用しています。)

于 2013-03-12T22:23:18.773 に答える