使用Express构建REST API时如何通过请求URL控制返回的JSON内容
实现方案
首先纠正你给出的示例代码中的小问题:Express路由回调的参数顺序是(req, res, next),请求对象在前、响应对象在后,写反会导致调用响应方法时报错。
你可以通过抽离公共简历数据+动态路由参数的方案实现需求,不需要为每个字段单独写路由,具体实现如下:
步骤1:抽离独立的简历数据对象
把完整简历内容单独定义为全局常量,后续修改简历只需要调整这一处即可,不需要改动路由逻辑:
const fullResume = { // 你的完整简历字段 "name": "张三", "age": 28, "phone": "13xxxxxxxxx", "education": [ { "school": "XX大学", "major": "计算机科学与技术", "time": "2016-2020" } ], "experience": [ { "company": "XX科技有限公司", "post": "前端开发工程师", "time": "2020-至今" } ], "skills": ["JavaScript", "Node.js", "Express", "React"] }
步骤2:编写兼容根路径和字段路径的通用路由
使用Express可选动态路由参数实现两种请求的统一处理,同时增加字段合法性校验避免报错:
// :section? 代表参数是可选的,请求根路径时section参数为空 app.get('/:section?', (req, res, next) => { const requestSection = req.params.section // 请求根路径,返回完整简历 if (!requestSection) { return res.json(fullResume) } // 校验请求的字段是否存在于简历对象中 if (fullResume.hasOwnProperty(requestSection)) { return res.json(fullResume[requestSection]) } // 非法字段返回404提示 res.status(404).json({ code: 404, message: `请求的简历字段 ${requestSection} 不存在` }) })
可选优化
如果需要对部分敏感字段(比如联系方式)单独做权限校验,只需要把对应字段的专属路由写在通用路由之前即可,Express会优先匹配先定义的路由:
// 优先匹配/phone路径的请求,单独做权限校验 app.get('/phone', (req, res, next) => { // 示例校验逻辑:请求参数携带正确token才返回联系方式 if (req.query.access_token !== '自定义校验密钥') { return res.status(403).json({ code: 403, message: "无权限查看联系方式" }) } res.json(fullResume.phone) }) // 通用路由写在所有专属路由之后 app.get('/:section?', (req, res, next) => { // 同上的通用逻辑 })
内容的提问来源于stack exchange,提问作者JCrew0
相关产品推荐
相关产品推荐

