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

我使用Express和Mongoose在Node.js之上构build了一个RESTful API

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

在res.send()之前删除它们的最好方法是什么? 我必须手动执行每个路线(获取,发布,更新)还是有一个通用的方法来过滤掉它们?

我尝试使用自定义中间件,但是这并不起作用 – 当我在使用(app.router)之前放置中间件时,res.body是未定义的,如果放置后,我的中间件从未被调用过。 另外,由于在中间件中,我正在处理单个文档和文档数组,我宁愿find一种方法来处理每个文档。

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

你可以使用.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. }); 

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

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