Adonis.js删除注册用户报错Row not found,如何实现无错删除?
解决Adonis.js删除用户时的「Row not found」错误
报错原因分析
你遇到的「Row not found」错误,是因为ChatUser.findOrFail(ctx.params.id)在指定ID的用户不存在时会直接抛出异常,触发catch块。另外当前代码还有两个潜在问题:
ctx.auth.user!的非空断言可能导致运行时错误(比如用户未登录时)- 部门不匹配时抛出的错误会混入通用异常,无法区分具体错误类型
修正后的代码
@inject() async deleteEquipe(ctx: HttpContext) { try { await ctx.bouncer.with('UserPolicy').allows('adminCobranca') // 先确认当前登录用户存在 const authUser = ctx.auth.user if (!authUser) { handleError(ctx, 'Usuário não autenticado') return } // 用find替代findOrFail,避免用户不存在时直接抛异常 const user = await ChatUser.find(ctx.params.id) if (!user) { handleError(ctx, 'Usuário não encontrado') return } // 检查用户是否属于当前部门 if (authUser.departamentoId !== user.departamentoId) { handleError(ctx, 'Usuário não pertence ao seu departamento') return } // 执行删除并返回成功响应 await user.delete() handleSuccess(ctx, 'Sucesso ao deletar usuário') } catch (error) { handleError(ctx, 'Erro ao processar solicitação', error) } }
关键修改说明
- 替换
findOrFail为find:find找不到记录时返回null,我们可以主动判断并返回精准的「用户不存在」提示,而非进入通用异常处理。 - 移除非空断言:先检查
ctx.auth.user是否存在,避免未登录场景下的运行时错误。 - 拆分逻辑分支:每个条件分支单独处理响应,让错误提示更清晰,同时避免逻辑嵌套过深。
- 统一异常捕获:catch块仅处理认证失败、策略检查失败等意外错误,给出通用提示。
内容的提问来源于stack exchange,提问作者Victor Martins
相关产品推荐
相关产品推荐

