Express Typescript不使用中间件



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

我只需要在下面的路径上调用auth中间件,仅用于测试目的。

我的用户路由.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)
}
}

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

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

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

最新更新