Node.js处理HTTP请求时如何过滤响应,仅返回姓名和手机号字段
解决方案
你可以通过以下3种常用方式实现字段过滤,按需选择即可:
方法1:查询时直接指定返回字段(最推荐)
在MongoDB/Mongoose的findOne方法第二个参数位置指定需要返回的字段,数据库查询阶段就会过滤掉敏感字段,避免敏感数据被加载到内存中:
router.get('/name/:id', async(req, res) => { // 第二个参数指定只返回name、phone字段,_id默认返回,不需要的话可以加-_id排除 const user = await Model.findOne({ _id: req.params.id }, 'name phone'); if (user) res.status(200).json(user); else res.status(404).json({ message: "User doesn't exist" }); })
补充:这里顺便把原代码的500状态码改成404更符合HTTP语义,用户不存在属于资源未找到,不属于服务器内部错误
方法2:手动构造返回对象
如果不想修改查询逻辑,也可以在返回前手动筛选字段,只返回需要的内容:
router.get('/name/:id', async(req, res) => { const user = await Model.findOne({ _id: req.params.id }); if (user) res.status(200).json({ name: user.name, phone: user.phone }); else res.status(404).json({ message: "User doesn't exist" }); })
方法3:Schema层面默认隐藏敏感字段
如果所有涉及该用户模型的接口都不需要返回邮箱、密码等字段,可以直接在定义Schema时给敏感字段设置select: false属性,后续所有查询默认都不会返回这些字段:
const userSchema = new mongoose.Schema({ name: String, phone: String, email: { type: String, select: false // 默认不返回该字段 }, password: { type: String, select: false // 默认不返回该字段 } // 其余字段定义 })
如果某个特殊场景需要返回被隐藏的字段,查询时加上.select('+email +password')即可临时拉取指定隐藏字段。
内容的提问来源于stack exchange,提问作者Sarah
相关产品推荐
相关产品推荐

