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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 03:45:02