基于Express和Mongoose的REST API - 在将对象返回给用户之前过滤掉对象的某些属性

时间:2012-10-24 21:29:34

标签: javascript node.js express mongoose

我正在Node.js

上使用Express和Mongoose构建RESTful API

我在我的架构中使用的某些字段/属性仅供内部使用,API用户根本不应该看到它们。

在res.send()之前删除它们的最佳方法是什么?我是否必须按照每条路线(获取,发布,更新)手动执行此操作,还是有一般方法将其过滤掉?

我尝试使用自定义中间件,但这不起作用 - 当我在使用(app.router)之前放置我的中间件时,res.body未定义,如果我放置它,我的中间件从未被调用过。此外,由于在中间件中我处理单个文档和文档数组,我宁愿找到一种方法来按文档执行。

3 个答案:

答案 0 :(得分:1)

您可以使用架构字段定义的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);

答案 1 :(得分:0)

您可以使用.populate() - 第二个参数将采用-fieldname,假设您的item.created_by是对User对象的模式引用...

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.
});

答案 2 :(得分:0)

另一种方法是应用程序在发送对象之前调用的一组trimmer / cleaner函数。

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省略函数。)