gpt4 book ai didi

javascript - Express Typescript 不使用中间件

转载 作者:行者123 更新时间:2023-12-02 21:18:13 26 4
gpt4 key购买 nike

我构建了一个简单的身份验证中间件,但不知何故,中间件根本没有被调用,如果我在中间函数中抛出一个错误,它只会被忽略,不会打印任何内容。

我只需要在下面的路由上调用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 了承载空间,并尝试从登录后获得的 token 中找到正确的用户。 token 已正确保存到我的 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 匹配)。

关于javascript - Express Typescript 不使用中间件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60913157/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com