Inversify中httpContext始终为空对象问题求助
问题排查与解决方案
针对你遇到的BaseHttpController中httpContext为空的问题,可从以下几个关键环节逐一排查:
1. 确认AuthenticationProvider的正确实现
自定义认证提供者必须将查询到的用户赋值给req.user,inversify-express-utils的httpContext.user本质是对req.user的映射,这是核心步骤:
import { injectable } from "inversify"; import { AuthenticationProvider } from "inversify-express-utils"; import { Request, Response, NextFunction } from "express"; @injectable() export class CustomAuthProvider implements AuthenticationProvider { async authenticate(req: Request, res: Response, next: NextFunction): Promise<any> { // 你的用户查询逻辑(已确认查询成功) const user = await yourUserFetchLogic(req.headers.authorization); // 关键:必须将用户对象挂载到req.user req.user = user; return user; } }
2. 检查控制器的装饰器配置
确保控制器类和方法使用正确的装饰器,并关联指定的认证策略:
import { controller, httpGet, BaseHttpController } from "inversify-express-utils"; // 第二个参数为认证策略名称,需与后续server配置一致 @controller("/api/profile", "auth") export class ProfileController extends BaseHttpController { @httpGet("/me") async getCurrentUser() { // 仅在HTTP请求处理方法内访问httpContext(构造函数内访问会为空) const user = this.httpContext.user; if (!user) { return this.unauthorized(); } return this.ok(user); } }
3. 验证容器绑定与Server初始化
确保容器正确绑定认证提供者,且Server配置中指定了匹配的认证策略:
import { Container } from "inversify"; import { InversifyExpressServer } from "inversify-express-utils"; import { CustomAuthProvider } from "./auth-provider"; // 必须导入控制器文件,让inversify扫描到 import "./controllers/profile-controller"; const container = new Container(); // 绑定认证提供者 container.bind<AuthenticationProvider>("AuthenticationProvider").to(CustomAuthProvider); const server = new InversifyExpressServer(container); server.setConfig((app) => { // 配置认证策略,名称需与控制器装饰器中的一致 server.setAuthStrategy({ name: "auth", handler: async (req, res, next) => { const authProvider = container.get<AuthenticationProvider>("AuthenticationProvider"); const user = await authProvider.authenticate(req, res, next); if (!user) { return res.status(401).send("Unauthorized"); } next(); } }); }); const app = server.build(); app.listen(3000);
4. 关键注意事项
- 禁止在控制器构造函数中访问
httpContext:httpContext仅在请求生命周期内被填充,构造函数执行时请求尚未进入处理流程。 - 确保控制器文件被导入到容器初始化文件中,否则inversify无法识别并注册控制器。
- 自定义认证提供者类必须添加
@injectable()装饰器,否则容器无法实例化该类。
内容的提问来源于stack exchange,提问作者Danny López
相关产品推荐
相关产品推荐

