AdonisJS 仅在使用 ORM 时使用 api 捕获数据库插入错误

AdonisJS catch database insert errors with api-only while using ORM

有没有办法捕获数据库插入错误,即在 api-only 模式下使用 Adonis ORM 时的重复条目。

在下面的示例中,如果用户名重复,它只会发送 500 内部服务器错误并将错误的完整 html 页转储到客户端。

即使我不知道错误是什么,我至少希望能够捕获错误并发送一个更有用的 json 对象,例如

{error: "Unable to insert user"}

这是一些示例代码

const User = use('App/Models/User')

class UserController {
    async register({ request }) {
        const { username, email, password, first_name, last_name } = request.all()
        const user = new User()
        user.fill({
            username,
            email,
            password,
            first_name,
            last_name
        })
        await user.save()
        return user
    }
}

部分解决: 我已经用下面的代码部分解决了这个问题,但我觉得好像必须有更好的/内置的方法来实现这个。

const User = use('App/Models/User')

class UserController {
    async saveData(object, errorMessage){
        try{
            await object.save()
            return object
        }
        catch(err) {
            return {error:`${errorMessage}`}
        }
    }
    async register({ request, response }) {
        const { username, email, password, first_name, last_name } = request.all()
        const user = new User()
        user.fill({
            username,
            email,
            password,
            first_name,
            last_name
        })
        return this.saveData(user, "Unable to save user")

    }
}

Try & catch 就是您要找的。您也可以使用 global exceptions.

关于您的重复错误,您还应该使用 AdonisJs Validator 以确保不会出现此错误。

因此,在保存模型之前,请检查给定的用户是否是唯一的。

所以你会有这样的东西

async register({ request, response }) {
    const { username, email, password, first_name, last_name } = request.all()

    const rules = {
      username: 'required|unqiue:username'
    };

    const validation = await validate(request.all(), rules);

    if (validation.fails()) {
      response.status(500).send(validation.messages());
    }

    const user = new User()
    user.fill({
        username,
        email,
        password,
        first_name,
        last_name
    })

    await user.save();

    return user;

}