// location.entity.ts
import {Entity, Column, PrimaryGeneratedColumn, CreateDateColumn} from 'typeorm'
@Entity('location')
export class Location {
@PrimaryGeneratedColumn()
id: number;
@Column({length: 500})
name: string;
@Column('text')
desc: string;
@CreateDateColumn({type: 'timestamp'})
date: number;
}
// black.middleware.ts
import {Injectable, NestMiddleware} from '@nestjs/common'
import {Response, Request} from 'express'
import {InjectRepository} from '@nestjs/typeorm'
import {Location} from 'src/location/location.entity'
import {Repository} from 'typeorm'
@Injectable()
export class BlackMiddleware implements NestMiddleware {
constructor(@InjectRepository(Location) private locationRepository: Repository<Location>) {
}
use(req: Request, res: Response, next: () => void): any {
console.log(this.locationRepository, 'aaa');
return true;
}
}
在中间件中,我想使用一些其他依赖注入,无论是实体,那么我如何正确引用它?
// app.module.ts
...
export class AppModule implements NestModule {
configure(consumer: MiddlewareConsumer): any {
consumer.apply(BlackMiddleware).forRoutes('*')
}
}
期望在中间件中使用typeorm,但我不知道如何解决依赖关系。中间件是否在全球范围内使用
这样使用的话会报错:
[Nest] 56559 - 2020/12/25 上午11:43:08 [ExceptionHandler] Nest can't resolve dependencies of the BlackMiddleware (?). Please make sure that the argument LocationRepository at index [0] is available in the BlackMiddleware context.
Potential solutions:
- If LocationRepository is a provider, is it part of the current BlackMiddleware?
- If LocationRepository is exported from a separate @Module, is that module imported within BlackMiddleware?
@Module({
imports: [ /* the Module containing LocationRepository */ ]
})
+0ms
Error: Nest can't resolve dependencies of the BlackMiddleware (?). Please make sure that the argument LocationRepository at index [0] is available in the BlackMiddleware context.
Potential solutions:
- If LocationRepository is a provider, is it part of the current BlackMiddleware?
- If LocationRepository is exported from a separate @Module, is that module imported within BlackMiddleware?
@Module({
imports: [ /* the Module containing LocationRepository */ ]
})
at Injector.lookupComponentInParentModules (/Users/brian/code/node/nest/learn-nest/node_modules/@nestjs/core/injector/injector.js:192:19)
at async Injector.resolveComponentInstance (/Users/brian/code/node/nest/learn-nest/node_modules/@nestjs/core/injector/injector.js:148:33)
at async resolveParam (/Users/brian/code/node/nest/learn-nest/node_modules/@nestjs/core/injector/injector.js:102:38)
at async Promise.all (index 0)
at async Injector.resolveConstructorParams (/Users/brian/code/node/nest/learn-nest/node_modules/@nestjs/core/injector/injector.js:117:27)
at async Injector.loadInstance (/Users/brian/code/node/nest/learn-nest/node_modules/@nestjs/core/injector/injector.js:81:9)
at async Injector.loadProvider (/Users/brian/code/node/nest/learn-nest/node_modules/@nestjs/core/injector/injector.js:38:9)
at async Promise.all (index 0)
at async InstanceLoader.createInstancesOfProviders (/Users/brian/code/node/nest/learn-nest/node_modules/@nestjs/core/injector/instance-loader.js:43:9)
at async /Users/brian/code/node/nest/learn-nest/node_modules/@nestjs/core/injector/instance-loader.js:28:13
at async Promise.all (index 26)
at async InstanceLoader.createInstances (/Users/brian/code/node/nest/learn-nest/node_modules/@nestjs/core/injector/instance-loader.js:27:9)
at async InstanceLoader.createInstancesOfDependencies (/Users/brian/code/node/nest/learn-nest/node_modules/@nestjs/core/injector/instance-loader.js:17:9)
at async /Users/brian/code/node/nest/learn-nest/node_modules/@nestjs/core/nest-factory.js:90:17
at async Function.asyncRun (/Users/brian/code/node/nest/learn-nest/node_modules/@nestjs/core/errors/exceptions-zone.js:18:13)
at async NestFactoryStatic.initialize (/Users/brian/code/node/nest/learn-nest/node_modules/@nestjs/core/nest-factory.js:88:13)
如何在中间件中正确使用其他依赖注入(例如数据库)?
也许你可以尝试
service
,就像controller
一样。让逻辑在服务层处理。
例如:
import { Injectable, Logger, NestMiddleware } from '@nestjs/common';
import { NextFunction, Request, Response } from 'express';
import * as requestIp from 'request-ip';
import { LoggerService } from 'src/logger/logger.service';
@Injectable()
export class HttpLoggerMiddleware implements NestMiddleware {
constructor(private readonly loggerService: LoggerService) {}
private logger = new Logger();
use(request: Request, response: Response, next: NextFunction): void {
const { ip, method, originalUrl } = request;
const clientIp = requestIp.getClientIp(request);
const msg = `${method} ${originalUrl} ${clientIp} ${ip} `;
this.logger.log(msg);
this.loggerService.create({
ip: clientIp,
originalUrl,
});
next();
}
}
虽然 lcysgsg 提供的答案是正确的,但还需要做一件事才能使实体正常工作。初始化该实体的服务需要从其各自的模块中导出。
例如:
@Module({
imports: [TypeOrmModule.forFeature([User])],
providers: [UserService],
controllers: [UserController],
exports: [UserService], //This needs to be added in source Module
})
export class UserModule {}