我是node.js的新手。我正在编写单个rest API,我想知道在不暴露不必要信息的情况下公开数据的正确方法是什么。
在我的示例中,我有一个“Tag”架构。而且我不想将猫鼬字段暴露给我的客户。我的代码:
apiRoutes.get('/tag', passport.authenticate('jwt', {
session: false
}), (req, res) => {
Tag.find({}, (err, tags) => {
return res.json(tags);
});
});
但在客户端,我不想公开“_id”和“__v”:
{
"_id": "57083a5e725f3cf0242a2916",
"tagName": "Test",
"en_us": "Testing",
"__v": 0,
"lastUpdated": "2016-04-08T23:10:22.759Z"
}
仅映射相关字段的正确方法是什么?
答案 0 :(得分:2)
您可以随时使用mongoose虚拟机。这是一个例子:
在您的模型中,您可以使用以下内容:
Tag
.virtual('public')
.get(function() {
return {
tagName: this.tagName,
en_us: this.en_us,
lastUpdated: this.lastUpdated
};
});
然后,在进行查询时,只需使用您创建的虚拟文件:
Tag.find({}, (err, tags) => {
res.json(tags.map(tag => tag.public));
});
答案 1 :(得分:1)
您可以使用Schema transform toJSON。这篇博客文章详细解释了ignore certain fields from mongoose schema when return object to client
TagSchema.set('toJSON', {
transform: function(doc, ret, options) {
delete ret._id;
delete ret.__v;
return ret;
}
});
答案 2 :(得分:1)
您可以在find
方法中声明以空格分隔的必填字段:
Tag.find({}, 'tagName en-us', (err, tags) => {
return res.json(tags);
});