使用的是 Koa2
'DELETE /:id': async (ctx,next)=>{
let id = ctx.params.id
// 校验权限
// checkPermission 是异步函数。
new RAService(ctx).checkPermission('user:delete:'+id)
// await new RAService(ctx).checkPermission('user:delete:'+id)
let u = await User.findOne({
where:{id}
})
await u.destory()
ctx.response.status = 200
}
如果此处checkPermission不加await, 一旦函数内部抛出异常,异常交由 catch 处理。但是此处我们未写 catch, 所以一旦出现异常,控制台会抛出 UnhandledPromiseRejectionWarning 的警告,Postman 中的返回结果为 Internal Server Error,即使我们在 checkPermission 内部使用了 ctx.throw(code,msg) 来抛出并返回我们自己定义的异常消息。
但是如果使用了 await ,控制台不会有任何意外的打印输出,并且 Postman 返回结果也是我们在checkPermission 内部使用 ctx.throw(401,ResponseMessage.USER_FORBIDDEN) 来抛出并返回我们自己定义的异常消息。
这是为什么呢? 我们知道 可以 r = await xxxx ,r 可以是 then(r=>{}) 的 r, 也可以是 catch(r=>{}) 的 r,看你的 async/Promise 的状态,但它仍会将异常继续抛出。










网友评论