如何在函数内部异步执行嵌套函数?Node.js async/await回调异常问题
问题根因
- 你使用的
request库的post方法是回调风格的异步API,本身不会返回Promise对象。即便pay函数被标记为async,也不会等待回调函数执行完成才返回,所以await orderApi.pay()拿到的是undefined,才会直接跳到app.js的后续逻辑。 - 回调函数里的
return redirectu只会把值返回给回调本身,不会作为pay函数的返回值向外传递。
修复方案
将回调风格的request请求手动包装为Promise即可,修改后的order API文件代码如下:
exports.pay = async function (body) { var headers = { 'X-Api-Key': 'test_d5f178f6f910a5ec48a429d540d', 'X-Auth-Token': 'test_f3f32cda3a7aafc2a188579530f' } var payload = { purpose: body.purpose, amount: body.amount, phone: body.phone, buyer_name: body.buyer_name, } // 包装为Promise实现await等待 return new Promise((resolve, reject) => { request.post('https://test.instamojo.com/api/1.1/payment-requests/', { form: payload, headers: headers }, function (error, response) { // 优先捕获请求错误 if (error) { return reject(error) } try { var parsed = JSON.parse(response.body); var redirectu = parsed.payment_request.longurl resolve(redirectu) } catch (parseErr) { // 捕获JSON解析错误 reject(parseErr) } }) }) }
额外优化建议
建议在外层调用处添加try/catch捕获异常,避免请求失败、解析失败等情况导致服务崩溃,修改后的app.js参考代码:
app.post('/pay', async function(req,res){ try { let response = await orderApi.pay(req.body) res.json(response) console.log(response) } catch (err) { console.error('支付请求失败:', err) res.status(500).json({code: 500, msg: '支付请求处理失败'}) } }
内容的提问来源于stack exchange,提问作者Harkirat Singh
相关产品推荐
相关产品推荐

