我正在使用 nodejs、express 和 inversify 构建一个非常小的 rest api。
这是我的工作代码:
索引.ts
const container = new Container();
container.bind<interfaces.Controller>(Types.Controller)
.to(MyController)
.whenTargetNamed(Targets.Controller.MyController);
container.bind<Types.Service>(Types.Service)
.to(MyService)
.whenTargetNamed(Targets.Services.MyService);
const server = new InversifyExpressServer(container);
const app = server.build();
app.listen(3000);
我的控制器.ts
@injectable()
@controller('/api/test')
export class MyController {
constructor(@inject(Types.Service)
@named(Targets.Service.MyService)
private MyService: MyService) { }
@httpGet('/')
public getCompanies(req: Request, res: Response, next: any): Promise<any[]>
{
console.log('getTestData');
return this.MyService.fetchAll();
}
}
上面的代码工作正常。当我想使用中间件检查身份验证令牌时,问题就出现了。
授权中间件.ts
function authMiddlewareFactory(
{
return (config: { role: string }) =>
{
return (req: Request, res: Response, next: any): void =>
{
const token = getToken(req);
console.log(token);
if (token === null)
{
res.status(403).json({ err: 'You are not allowed' });
return;
}
next();
}
}
const authMiddleware = authMiddlewareFactory();
export { authMiddleware };
如果我直接在控制器中直接使用 auth 中间件,我会按预期收到“不允许您”消息:
我的控制器.ts
@httpGet('/')
public getCompanies(req: Request, res: Response, next: any): Promise<any[]>
{
authMiddleware({ role: "admin" })(req, res, next);
console.log('getCompanies');
return this.CompanyService.fetchAll();
}
但如果我使用反转:
import { authMiddleware } from './authmiddleware'
@injectable()
@controller('/api/test', authMiddleware({ role: "admin" }))
export class MyController {
// same code as before
我在编译时收到以下错误:
错误:未找到 serviceIdentifier 的匹配绑定:
错误:未找到 serviceIdentifier 的匹配绑定:
在 InversifyExpressServer.resolveMidleware (node_modules/inversify-express-utils/lib/server.js:133:27) 在 InversifyExpressServer.registerControllers (inversify-express- utils/lib/server.js:106:21) 在 InversifyExpressServer.build (node_modules/inversify-express-utils/lib/server.js:94:14) 在 Object. (dist/index.js:52:20)
我假设我必须在 index.ts 中声明我的中间件,就像我为控制器和服务所做的那样。我试过但没有成功。
谢谢