关于Express.js请求仅在增强中间件调用后才被识别为已增强的技术咨询
Express.js请求仅在增强中间件调用后才被识别为已增强的技术咨询
看起来你正在搭建一个Express.js的认证中间件工厂函数,但代码好像没写完?先帮你理一理当前的实现逻辑,再聊聊关于“请求仅在中间件调用后才被增强”的相关问题吧。
首先先把你提供的代码完整展示出来:
import type { Request, Response, NextFunction } from 'express' export const authBuilder = (authenticate: boolean) => { return (req: Request, res: Response, next: NextFunction) => { if (!authenticate) { res.status(401).json({ message: 'Access denied.' }) return } req.user = { name: 'John Doe' } // 这里记得调用next(),不然请求会一直挂住哦 // next(); } }
先说说几个需要注意的点:
请求类型扩展问题:默认的Express
Request类型并没有user属性,直接给req.user赋值会触发TypeScript类型报错。你可以在项目里添加一个类型声明文件(比如src/types/express.d.ts)来扩展请求类型:declare global { namespace Express { interface Request { user?: { name: string }; } } }这样TypeScript就能识别
req.user这个自定义属性了。逻辑可能写反了:当前代码里,当
authenticate为false时直接返回401拒绝访问,这和常规的认证逻辑相反——一般是authenticate为true时才需要做认证校验,为false时直接放行请求。如果这是笔误,你可以调整成这样:if (!authenticate) { return next(); // 不需要认证,直接放行到下一个中间件/路由 } // 这里可以写实际的认证逻辑,比如校验token、查询用户信息等 req.user = { name: 'John Doe' }; next();关于“请求仅在中间件调用后才被增强”:这其实是Express中间件的正常工作机制——中间件是按注册顺序依次处理请求的,只有经过这个
authBuilder生成的中间件处理的请求,才会被添加上req.user属性。
举个实际的路由注册例子:
// 创建需要认证的中间件 const requireAuth = authBuilder(true); // 创建不需要认证的中间件 const skipAuth = authBuilder(false); // 这个路由会经过认证中间件,req.user会被赋值 app.get('/protected', requireAuth, (req, res) => { res.json({ currentUser: req.user }); }); // 这个路由没使用认证中间件,req.user不存在 app.get('/public', (req, res) => { res.json({ message: '这是公开路由,无需认证' }); });
如果你的困惑是“为什么有些请求没有user属性”,那大概率是这些请求没有挂载这个增强中间件。你只需要确保所有需要获取用户信息的路由,都在路由处理函数前挂载这个中间件就可以了。
备注:内容来源于stack exchange,提问作者user20416
相关产品推荐
相关产品推荐

