async函数signUp在await hash完成前返回,变量x为undefined如何修复
问题原因
async 函数执行时遇到 await 会立刻返回一个 pending 状态的 Promise 对象,不会等待内部异步逻辑执行完成。你之前直接同步调用 UserService.signUp() 拿到的是 Promise 而非函数实际返回的结果,所以 x.success 为 undefined,且 console.log("debug") 会在加密、创建用户逻辑执行前就运行。
修复步骤
1. 修改路由回调,添加 async/await
把 router.post 的回调函数标记为 async,调用 signUp 前加 await 关键字,等待异步逻辑执行完成再往下走:
router.post('/register', async (req, res) => { var username = req.body.username, password = req.body.password, email = req.body.email // 加await等待signUp执行完成 var x = await UserService.signUp(username, password, email); console.log("debug") if (x.success) { // 原有业务逻辑 } })
2. 优化signUp逻辑(可选但必要)
你现有代码中 createUser 调用没有传参数,且如果该方法是异步数据库操作,也需要加 await 确保用户创建完成后再返回,同时异常分支建议返回失败结果:
async function signUp(username, password, email) { try { var salt = generateSalt() console.log("generated salt") var passwordHash = await hash(password, salt) console.log("generated hash") } catch (err) { console.error(err) // 加密失败直接返回错误,不执行后续创建用户逻辑 return { success: false, description: '密码加密失败' } } // 传入必要参数,异步方法加await await UserModel.createUser(username, email, salt, passwordHash) console.log("created user") return { success: true, description: 'User was created' } }
效果说明
修改后执行顺序会完全符合预期:先生成盐、生成哈希、创建用户,之后才会打印debug并执行后续逻辑。如果担心异步异常导致请求报错,可以在路由的await外层加try-catch捕获错误处理即可。
内容的提问来源于stack exchange,提问作者Angry Red Panda
相关产品推荐
相关产品推荐

