You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在函数内部异步执行嵌套函数?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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 22:45:05