Express Typescript 不使用中间件

Express Typescript does not use Middleware

我构建了一个简单的 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
}

在我的中间件中,我基本上 trim Bearer Space 并尝试从我登录后获得的令牌中找到正确的用户。令牌正确保存到我的 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)
   }
}

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

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

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