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
相关产品推荐
相关产品推荐

