如何修改Express代码,使GET接口可向Postman返回JSON数据
问题原因&修复方案
你当前代码无法响应Postman的GET请求主要有三个核心问题:
- 异步流程逻辑错误:
getToken、getGames都是异步网络请求,你使用setTimeout延迟1秒调用的方式不可靠,且没有在请求完成的回调里触发响应 - 响应对象被覆盖:内层request请求的回调参数命名为
res,和外层/getinfo路由的响应对象重名,导致你无法调用正确的响应方法返回数据 - 没有主动触发响应:拿到游戏接口返回的可打印数据后,你没有调用路由响应对象的返回方法把数据回传给请求方
修复后的完整代码
const express = require('express'); const app = express(); const PORT = 5000; const request = require('request'); // 未使用的apicall可自行删除,这里保留原始引入状态 app.get('/', (req, res) => { res.send("Hello world!") }); app.get('/getinfo', (req, res) => { // 移除多余的body参数 const getToken = (url, callback) => { const options = { url: process.env.GET_TOKEN, json: true, body: { client_id: process.env.CLIENT_ID, client_secret: process.env.CLIENT_SECRET, grant_type: 'client_credentials' } }; // 回调参数重命名为tokenRes,避免和外层路由响应对象冲突 request.post(options, (err, tokenRes, body) => { if(err) { console.log(err) return callback(err) } console.log(`获取Token状态: ${tokenRes.statusCode}`) console.log(body); callback(null, tokenRes.body.access_token); }); } const getGames = (url, accessToken, callback) => { const gameOptions = { url: process.env.GET_GAMES, method: 'GET', headers: { 'Client-ID': process.env.CLIENT_ID, 'Authorization': 'Bearer ' + accessToken } }; // 回调参数重命名为gameRes,避免和外层路由响应对象冲突 request.get(gameOptions, (err, gameRes, body) => { if(err) { console.log(err); return callback(err) } console.log(`获取游戏数据状态: ${gameRes.statusCode}`); const gameData = JSON.parse(body); console.log(gameData); callback(null, gameData) }) } // 按异步逻辑顺序执行,移除不可靠的setTimeout延迟 getToken(process.env.GET_TOKEN, (err, accessToken) => { if(err) { // 接口异常时返回错误信息给客户端 return res.status(500).json({code: 500, msg: '获取Token失败', error: err}) } getGames(process.env.GET_GAMES, accessToken, (err, gameData) => { if(err) { return res.status(500).json({code: 500, msg: '获取游戏数据失败', error: err}) } // 拿到有效数据后直接返回给请求方 res.json({code: 200, data: gameData}) }) }) }); app.listen(PORT, () => { console.log(`Example app listening on port ${PORT}`); });
主要改动说明
- 修正变量命名冲突,内层请求回调的响应对象分别命名为
tokenRes和gameRes,不会再覆盖外层路由的响应对象 - 移除不可靠的setTimeout延迟逻辑,改为在
getToken请求成功的回调中调用getGames,保证异步请求顺序正确 - 新增错误处理逻辑,请求失败时主动返回错误信息给客户端,避免请求无响应超时
- 在
getGames拿到有效数据后直接调用res.json,将数据返回给Postman请求发起方
内容的提问来源于stack exchange,提问作者T888
相关产品推荐
相关产品推荐

