Koa.js 中间件中 next() 的正确使用

问题描述 投票:0回答:1

我使用Koa(2.11.0)。

我有这个非常简化的中间件功能,简化后看起来很奇怪。

但是,提出问题更容易。 我有两个 if 语句,并且抛出了 3 次。 扔完后,我不确定在这三个地方做什么最好:

  1. 什么都不做,Koa 会处理一切
  2. 添加 return,虽然添加它没有任何价值,但至少代码具有一定的可读性。
  3. 添加 return next()
//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)
    }
  }
}
javascript node.js koa koa2
1个回答
0
投票

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
令牌,但如果您使用其他东西,您可以替换它。

© www.soinside.com 2019 - 2024. All rights reserved.