【问题标题】:Express Typescript does not use MiddlewareExpress Typescript 不使用中间件
【发布时间】:2020-03-29 10:54:37
【问题描述】:

我构建了一个简单的 Auth 中间件,但不知何故,中间件根本没有被调用,例如,如果我在中间函数中抛出一个错误,它就会被忽略,什么也没有打印出来。

我只需要在下面的路由上调用auth中间件,只是为了测试目的。

我的 UserRoutes.ts

import auth from '../middleware/auth';

export default class UserRoutes {

  public UserController: UserController = new UserController();

  public routes(app: Application): void {
    // ...
    app.route('/api/users/me')
      .get(this.UserController.me, auth); // this is where I call my auth middleware
}

在我的中间件中,我基本上修剪了承载空间,并尝试从我登录后获得的令牌中找到正确的用户。令牌已正确保存到我的 mongodb。

我的身份验证中间件如下所示:

const auth = async (req: IUserRequest, res: Response, next: NextFunction) => {
  const token = req.header('Authorization').replace('Bearer ', '');
  const msg = { auth: false, message: 'No token provided.' };

  if (!token) res.status(500).send(msg);

  try {
    const data: any = jwt.verify(token, JWT_KEY);
    const user = await User.findOne({ _id: data._id, 'tokens.token': token });

    if (!user) {
      throw new Error("Could not find User");
    }

    req.user = user;
    req.token = token;
    next();
  } catch (error) {
    res.status(401).send({ error: 'Not authorized to access this resource.' });
  }
}

export default auth;

UserController.ts:

export class UserController {
   ///...
   public me(req: IUserRequest, res: Response) {
     res.send(req.user)
   }
}

【问题讨论】:

  • 什么是this.UserController.me?请在auth 执行之前显示该代码,如果它有问题或没有调用next(),那么auth 将永远不会被调用。
  • @jfriend00 它指的是调用 me 方法的 UsersController
  • @jfriend00 用我的测试方法更新了问题

标签: javascript typescript express middleware


【解决方案1】:

好吧,您的 me 方法是第一个调用的处理程序并发送响应并结束所有处理。不会调用其他路线。中间件要真正充当中间件并做某事,然后让其他路由继续被调用,它需要:

  1. 不发送响应。从技术上讲它可以,但随后的路由就没有意义了,因为您只能根据请求发送完成的响应。
  2. 调用next(),这是传递给它的第三个参数(您尚未声明),当它完成处理并希望路由继续时。

所以,因为 me() 是第一个并且它会结束所有路由,所以您的 auth() 处理程序永远不会被调用。也许您打算将auth() 处理程序放在首位?路由按照它们在代码中注册的顺序执行(假设它们与当前传入的 URL 匹配)。

【讨论】:

  • 但是中间件不应该在实际方法之前检查给定用户是否被授权吗?
  • @utdev - 路由处理程序按声明的顺序调用(假设它们与传入的 URL 匹配)。因此,me() 将在 auth() 之前被调用。如果您想先调用auth(),则颠倒顺序。
  • 你说的顺序很重要,所以我这样做.get(auth, this.UserController.me);
  • 是的,更改顺序有效,我认为第二个参数是为中间件指定的:D 非常感谢,您可以在答案中添加顺序 :)
  • @utdev - 是的,没错。另外,请记住,我们所说的中间件和我们所说的路由处理程序之间实际上并没有太大的技术差异。它们都具有相同的功能。它们都只是请求到达时调用的处理程序。我们将通常不发送响应的东西称为中间件,但在通常会发送响应的代码之前做一些准备工作,但它们在技术上并没有什么不同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-25
  • 1970-01-01
  • 2021-06-09
  • 2022-10-06
  • 2021-04-25
  • 2021-11-18
  • 2017-07-11
相关资源
最近更新 更多