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

Node.js中如何获取并返回异步回调函数内部的返回值

问题原因

空值问题是异步回调执行顺序导致的:chimesdkmessaging.createChannel的回调函数属于异步执行逻辑,代码会先执行到末尾的return语句返回channel,此时回调还未触发,channel自然还是初始的null值。

解决方法

AWS SDK v2的接口默认支持.promise()调用,你可以把回调写法改成async/await写法,就能同步拿到异步返回的结果,修改后的代码如下:

async function createChannel(req) {
  let user_id = req.query.user_id;
  let chat_name = req.query.chat_name;
  var chimesdkmessaging = new AWS.ChimeSDKMessaging({region: region});

  try {
    let dateNow = new Date();
    const params = {
      Name: chat_name,
      AppInstanceArn: config.aws_chime_app_istance,
      ClientRequestToken: dateNow.getHours().toString() + dateNow.getMinutes().toString(),
      // 原代码这里漏了注释标记,已补充
      ChimeBearer: await AppInstanceUserArn(user_id), // AppInstanceUserArn of the user making the API call.
      Mode: 'RESTRICTED',
      Privacy: 'PRIVATE'
    };
    // 替换回调写法为await promise调用
    const data = await chimesdkmessaging.createChannel(params).promise();
    console.log(data);
    console.log('Assegno il canale: ' + data.ChannelArn);
    const channel = data.ChannelArn;
    // 拿到结果后再返回
    return response({data: channel},200);
  } catch (e) {
    console.log(e, e.stack);
    return response({error: e}, 500);
  }
}

修改逻辑说明:

  • 调用.promise()可以把AWS SDK的回调式接口转换成标准Promise对象,直接用await等待异步执行完成,就能拿到返回结果
  • 错误逻辑会直接被外层的try/catch捕获,不需要在回调里单独做错误处理
  • 成功返回逻辑挪到try块内拿到结果之后,保证返回时channel已经完成赋值

内容的提问来源于stack exchange,提问作者Mariano

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 12:15:04