如何在中间件中使用数据库实体?

问题描述 投票:0回答:2

// 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)

如何在中间件中正确使用其他依赖注入(例如数据库)?

node.js express nestjs
2个回答
2
投票

也许你可以尝试

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();
  }
}


0
投票

虽然 lcysgsg 提供的答案是正确的,但还需要做一件事才能使实体正常工作。初始化该实体的服务需要从其各自的模块中导出。

例如:

@Module({
    imports: [TypeOrmModule.forFeature([User])],
    providers: [UserService],
    controllers: [UserController],
    exports: [UserService], //This needs to be added in source Module
})
export class UserModule {}
© www.soinside.com 2019 - 2024. All rights reserved.