使用的是 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
的状态,但它仍会将异常继续抛出。