我使用Koa(2.11.0)。
我有这个非常简化的中间件功能,简化后看起来很奇怪。
但是,提出问题更容易。 我有两个 if 语句,并且抛出了 3 次。 扔完后,我不确定在这三个地方做什么最好:
//This is Koa middleware
const tokenProvider: (persons: string[]) => Middleware = (
): Middleware => {
return async (ctx: Context, next: () => Promise<void>): Promise<void> => {
const authorizationHeader: string = ctx.headers.authorization
if (!authorizationHeader) {
ctx.throw(STATUS_CODES.UNAUTHORIZED)
}
try {
const token: string = authorizationHeader.split(' ').pop()
if (!token ) {
ctx.throw(STATUS_CODES.FORBIDDEN)
// Should I use:
// - return
// - return next()
// - nothing should be used, as Koa will handle it
}
return next()
} catch (error) {
ctx.throw(STATUS_CODES.UNAUTHORIZED)
}
}
}
Koa 的
ctx.throw
实际上会抛出异常,因此没有必要在 ctx.throw
之后立即放置语句,因为它们会被跳过,就像使用 throw new Error()
一样。
这也意味着这个声明没有用:
ctx.throw(STATUS_CODES.FORBIDDEN)
因为你立刻抓住了它,然后把它变成了别的东西。这就是我重写你的中间件的方式:
//This is Koa middleware
const tokenProvider: (persons: string[]) => Middleware = (
): Middleware => {
return async (ctx: Context, next: () => Promise<void>): Promise<void> => {
const authorizationHeader: string = ctx.headers.authorization
if (!authorizationHeader || !authorizationHeader.startsWith('Bearer ')) {
ctx.set('WWW-Authenticate: Bearer');
ctx.throw(
STATUS_CODES.UNAUTHORIZED,
'Authentication with a Bearer token is required on this endpoint',
);
}
const token = authorizationHeader.substr('Bearer '.length);
// I supposed you want check the bearer token here?
return next()
}
}
请注意,我假设您正在使用
Bearer
令牌,但如果您使用其他东西,您可以替换它。