Axios异步调用函数返回值无法正确回传,console打印undefined问题求助
问题根因
你遇到的返回undefined问题完全来自async函数的返回值缺失和异步等待逻辑错误,具体有2个核心问题:
- 自定义的
getPartnerDetails、getRawJson两个async函数均没有显式返回处理结果,async函数无return语句时默认返回undefined,这是最直接的原因 - 同时混用
await和.then()语法导致逻辑嵌套混乱,内部异步调用完成后没有将结果逐层向上传递,局部catch只打印错误没有向外抛出,也会导致异常场景下的返回值异常
修正后的完整代码
// 第三方API请求统一配置可提前抽离,避免重复写 const BASE_HOST = 'https://host.com/im/account/consumer' const headers = { // 你原来的公共header配置放这里 } app.post('/checkuser', async (req, res, next) => { try { const { man, bfn, bln, bsn, bc, bs, bz, bco } = req.body; const bodyContent = { man, bfn, bln, bsn, bc, bs, bz, bco, profile: 'DEFAULT', }; // 第一步:获取mtid const firstRes = await axios.post(`${BASE_HOST}`, bodyContent, { headers }); const addressValidResult = firstRes.data.score.etr.filter( result => result.test === '19:2' )[0]; const requestId = firstRes.data.mtid; // 第二步:获取最终结果 const currentValidAddress = await getPartnerDetails(requestId); // 统一返回 console.log('this is currentvalidaddress ', currentValidAddress); res.json({ validationMessage: addressValidResult, currentValidAddress }); } catch (err) { next(err); } }); async function getPartnerDetails(appId) { const config = { headers: { 'Content-Type': 'application/json', Authorization: 'Basic M2QzMsdfsslkfglkdjfglkdjflkgd', }, params: { partner: 19 }, }; const partnerRes = await axios.get(`${BASE_HOST}/${appId}/partner/requests`, config); const requestId = partnerRes.data.requests[0].request_id; console.log('this is request id ', requestId); // 等待getRawJson返回结果后再return,把结果传递到上层 const rawResult = await getRawJson(appId, requestId); return rawResult; } async function getRawJson(appId, requestId) { const rawRes = await axios.get(`${BASE_HOST}/${appId}/partner/request/${requestId}`, { headers }); console.log('this is getRawJson result ', rawRes.data); // 这里如果不需要序列化可以直接return rawRes.data,根据你的业务需求调整 return JSON.stringify(rawRes.data); }
关于是否拆分入口的建议
不建议拆分为3个独立入口,原因如下:
- 服务端聚合请求可以大幅降低客户端逻辑复杂度,客户端只需要发起1次请求等待结果即可,不需要处理链式调用的异常、超时等问题
- 第三方API的鉴权密钥可以完全保留在服务端,不会暴露给客户端带来安全风险
- 方便服务端统一做请求缓存、降级、限流等处理,也可以灵活调整第三方API的调用逻辑,不需要客户端发版配合
只有当三个步骤有独立的业务复用需求,或者后续步骤需要用户在客户端做人工选择干预时,才需要拆分为独立入口。
内容的提问来源于stack exchange,提问作者Glenncito
相关产品推荐
相关产品推荐

