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

Node.js异步回调无法返回预期值,接口返回undefined问题求助

问题根源
  • 异步模式混用:代码同时使用回调函数和async/await两种异步处理方案,回调函数内部的return无法向外层async函数传递返回值,导致结果链路断裂。
  • readKey方法返回值异常:AWS S3的getObject方法传入回调时返回的是请求对象而非Promise,await无法捕获其执行状态,且readKey本身没有主动返回结果,最终await readKey()拿到的永远是undefined。
  • compareActivePin方法缺少返回语句:PIN校验通过的分支中仅调用了readKey,没有将其执行结果return出去,该分支执行完毕后函数无返回值,自然得到undefined。
解决方案

1. 改造readKey方法,转为纯Promise模式

移除冗余的回调参数,调用AWS SDK内置的.promise()方法将回调式API转为可await的Promise,直接返回读取到的文件内容:

const readKey = async (key) => {
  const aws = require("aws-sdk");

  aws.config.update({
    secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,
    accessKeyId: process.env.AWS_ACCESS_KEY_ID,
    region: "us-east-2",
  });

  const s3 = new aws.S3();
  const getParams = { Bucket: process.env.SK_BUCKET, Key: `${key}.txt` };
  const data = await s3.getObject(getParams).promise();
  return data.Body.toString();
};

2. 改造compareActivePin方法,补充返回语句

在PIN校验通过的分支中,新增return语句将readKey的执行结果返回给外层调用:

async function compareActivePin(userId, received_pin) {
  const active_pin = await db("account_pins").where({ userId, isActive: true });
  const pinIsValidated = bcrypt.compareSync(
    received_pin,
    active_pin[0].account_pin
  );

  if (pinIsValidated) {
    let skLocation = await db("sks").where({ userId }).select("url");
    return await readKey(skLocation[0].url);
  } else return false;
}

可选优化:补充边缘情况校验

可新增对active_pin、skLocation是否为空的判断,以及异步操作的异常捕获,避免参数异常时接口直接报错。

内容的提问来源于stack exchange,提问作者A.Codera

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 03:48:04