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() - 第二个参数将采用 -fieldname,假设您的 item.created_by 是对用户对象的架构引用...

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

另一种方法是您的应用程序在发送对象之前调用的一组修剪器/清洁器函数。

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 回答