一. 易错中间件编码
废话不多说,我给大家写个Demo
:
const auth = () => {
return async (ctx: Context, next: () => any) => {
const user = getUser();
if (user) {
const {hasPermission} = user;
// 如果没有权限
if (!hasPermission) {
ctx.body = {
CODE: 'NO_PERMISSION',
};
} else{
await next();
}
}
};
};
export default auth;
伪代码很简单,意思就是:
- 如果用户没有权限,返回一个固定的
Code
。 - 如果有权限则放行。
这段代码从语义上看其实并没有任何问题,用过Egg
的小伙伴也知道,给ctx.body
对象赋值,也相当于给最终返回对象赋值。
但是这个代码却有着很严重的问题,我们先来回顾一下洋葱模型。
1.1 中间件和洋葱模型
解释如下:
-
Egg.js
中间件的执行顺序是按照洋葱模型来进行的,即请求从外到内依次经过每个中间件,再从内到外依次返回响应结果。 - 在这个过程中,每个中间件都需要执行
await next()
将控制权交给下一个中间件或路由处理函数。 - 如果某个中间件没有执行
await next()
,则会导致请求无法继续往下执行,也就无法返回响应结果。 - 因此,如果不执行
await next()
,则需要使用return
明确地结束当前中间件函数的执行,并将控制权交还给上一个中间件或路由处理函数,以保证请求能够正常地继续执行。
我们重点关注最后一句话,就是说,如果你不执行await next()
,一定要执行“return” 函数。即使你给ctx.body
赋值了也没有用,因为程序它会阻塞。
那么正确的做法就是:文章来源:https://www.toymoban.com/news/detail-534217.html
const auth = () => {
return async (ctx: Context, next: () => any) => {
const user = getUser();
if (user) {
const {hasPermission} = user;
// 如果没有权限
if (!hasPermission) {
ctx.body = {
CODE: 'NO_PERMISSION',
};
return;
}
}
await next();
};
};
export default auth;
写中间件的时候,一定要注意这个点:文章来源地址https://www.toymoban.com/news/detail-534217.html
- 你的中间件必须有两种返回:要么
return
,要么await next()
。
到了这里,关于Egg - 中间件易错点和洋葱模型的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!