【问题标题】:Koa Endpoint always return 404Koa 端点总是返回 404
【发布时间】:2019-02-28 14:28:27
【问题描述】:

我遇到了一个问题,我认为电话返回得太早,并且我的响应总是 404 - Not Found 消息。该条目是在数据库中创建的,因此我知道它会提前返回。我想我已经等待了正确的部分,但显然情况并非如此。我也尝试过在 db.AddUser 上等待,但没有运气。

端点

//Post signup
public async SignUpAsync(ctx: Context) {
    try {
        let code = await SignUpVerification.GenerateCode();
        let user = await this.InfoFromRequest(ctx.request.body);
        user.Code = code;
        await db.AddUser(user);
        console.log('added db user');
        //await SignUpVerification.SendVerificationText(user.PhoneNumber, code)
        console.log('success message');
        ctx.body = 'Success';
    } catch (err) {
        ctx.status = 400;
        ctx.body = err;
    }
};

private async InfoFromRequest(requestBody: any) {
    return {
        Email: requestBody['email'],
        FirstName: requestBody['firstname'],
        MiddleName: requestBody['middlename'],
        LastName: requestBody['lastname'],
        Pwd: requestBody['pwd'],
        PhoneNumber: requestBody['phonenumber']
    } as IUserModel;
}

调用模型

async AddUser(newUser: IUserModel) {
    return await userModel.AddUser(newUser);
}

模型调用

async AddUser(newUser: IUserModel) {
    try {
        var userToSave = new User({
            name: {
                firstname: newUser.FirstName,
                middlename: newUser.MiddleName,
                lastname: newUser.LastName
            },
            email: newUser.Email,
            pwd: newUser.Pwd,
            code: newUser.Code,
            phonenumber: newUser.PhoneNumber
        });

        let result = await userToSave.save();
        console.log('New User saved');
        console.log(result);
    } catch (err) {
        throw new Error(err);
    }
}

方法生成从模型调用返回的代码

static async GenerateCode() {
    return await (Math.floor(Math.random() * 90000) + 10000).toString();
}

【问题讨论】:

  • 如果我没记错的话,你的 SignUpAsync 中间件应该返回一个 Koa 可以等待的承诺。也许return db.AddUser(user).then(
  • @Greg 我尝试了你所说的它仍然没有等待。我编辑代码以更好地反映执行此操作的方法。
  • @JoshuadeLeon 没有看到任何真正的问题。您能分享一下您是如何将SignUpAsync 中间件添加到应用程序的吗?
  • 旁白:使用crypto.randomBytes() 获取密码!
  • Bonus2:GenerateCode 不需要异步,InfoFromRequest 也不需要。

标签: node.js typescript mongoose async-await koa


【解决方案1】:

Evert 在查看如何在中间件中添加函数时走上了正轨。

之前

this.router.post(
            'login/',
            (ctx) => {
                this.controller.LoginAsync(ctx);
            }
        );

正确

this.router.post(
            'login/',
            async (ctx) => {
                await this.controller.LoginAsync(ctx);
            }
        );

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-05
    • 2015-07-31
    • 2019-11-29
    • 2020-12-23
    • 2016-02-04
    • 2014-05-29
    • 2021-07-28
    • 2015-11-23
    相关资源
    最近更新 更多