如何将数据从服务器暴露给客户端

时间:2016-04-09 00:01:00

标签: node.js mongodb mongoose

我是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"
    }

仅映射相关字段的正确方法是什么?

3 个答案:

答案 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);
});

检查mongoose documenation