在嵌套 js 微服务控制器中使用功能模块服务的问题

Posted

技术标签:

【中文标题】在嵌套 js 微服务控制器中使用功能模块服务的问题【英文标题】:Issue with using feature module services in nest js micro service controller 【发布时间】:2021-07-06 22:24:44 【问题描述】:

我创建了一个功能模块“用户”。在这个模块中,我创建了控制器、模型和服务来连接到我的 postgres 数据库。 但是,如果我尝试从我的功能模块控制器调用 userService,我会收到以下错误 [RpcExceptionsHandler] 无法读取未定义的属性“get_users” TypeError:无法读取未定义的属性“get_users” 在 UserController.get (/usr/src/app/dist/user/controller/user.controller.js:23:33) 在 /usr/src/app/node_modules/@nestjs/microservices/context/rpc-context-creator.js:44:33 在 processTicksAndRejections (internal/process/task_queues.js:93:5) 在异步 /usr/src/app/node_modules/@nestjs/microservices/context/rpc-proxy.js:11:32 在异步 ServerTCP.handleMessage (/usr/src/app/node_modules/@nestjs/microservices/server/server-tcp.js:55:54)

下面是我的 user.controller.ts 文件:

import  Logger  from '@nestjs/common';
import  UserI  from '../models/user.interface';
import  UserService  from '../service/user.service';
import  MessagePattern  from '@nestjs/microservices';

export class UserController 

    private logger = new Logger('AppController');
    constructor(private readonly userService: UserService) 

    @MessagePattern('add_user')
    async add(user: UserI) 
        return this.userService.add(user);
    

    @MessagePattern('get_user')
    async get() 
        return this.userService.get_users();
    

++++++++++++++++++++++++ user.service.ts:

import  Injectable  from '@nestjs/common';
import  InjectRepository  from '@nestjs/typeorm';
import  from  from 'rxjs';
import  Repository  from 'typeorm';
import  UserEntity  from '../models/user.entity';
import  UserI  from '../models/user.interface';

@Injectable()
export class UserService 

    
    constructor(
        @InjectRepository(UserEntity)
        private userRepository: Repository<UserEntity>
    ) 

    add(user: UserI) 
        return this.userRepository.save(user);
    

    get_users() 
        return this.userRepository.find();
    

user.module.ts:

import  Module  from '@nestjs/common';
import  TypeOrmModule  from '@nestjs/typeorm';
import  UserController  from './controller/user.controller';
import  UserEntity  from './models/user.entity';
import  UserService  from './service/user.service';


@Module(
    imports:[
        TypeOrmModule.forFeature([UserEntity])
    ],
    providers: [UserService],
    controllers: [UserController]
)
export class UserModule 

+++++++++++++++++ app.module.ts

import  Module  from '@nestjs/common';
import  TypeOrmModule  from '@nestjs/typeorm';
import  ConfigModule  from '@nestjs/config';
import  UserModule  from './user/user.module';

@Module(
  imports: [
    ConfigModule.forRoot(isGlobal:true),
    TypeOrmModule.forRoot(
      type: 'postgres',
      url: process.env.DATABASE_URL,
      autoLoadEntities: true,
      synchronize: true
    ),
    UserModule
  ],
  controllers: [],
  providers: [],
)
export class AppModule 

【问题讨论】:

你可能在使用 webpack 吗?或者其他可以修改注入令牌的东西?从您显示的代码来看,一切看起来都很好。也许添加@Controller() 会解决它? 添加@Controller 后问题已修复,但现在我收到不同的错误消息。 [ExceptionHandler] Nest 无法解析 UserController (?) 的依赖关系。请确保索引 [0] 处的参数 UserService 在 AppModule 上下文中可用。 @JayMcDoniel 【参考方案1】:

您应该将UserController 标记为控制器,以便能够在其中注入想法。只需在您的UserController 类中添加@Controller()。 https://docs.nestjs.com/controllers

【讨论】:

添加控制器装饰器后该错误已解决。但现在我得到了如上所述的不同错误。【参考方案2】:

看起来被提取的UserController来自AppModule。你应该只在一个模块文件中定义你的提供者和控制器,否则你最终会覆盖一些元数据。从AppModule 中删除UserController 并将其仅保留到UserModule。它应该可以从那里解决您的问题。

【讨论】:

我没有在应用模块中导入用户控制器,目前它只在用户模块中,如描述所示。 @McDoniel 不需要在应用模块中拥有该控制器,我已经在用户模块中拥有它。 @pkvd 对,但您的错误实际上是关于在AppModule 的上下文中无法解决UserController 的依赖关系。

以上是关于在嵌套 js 微服务控制器中使用功能模块服务的问题的主要内容,如果未能解决你的问题,请参考以下文章

如何给运行在 SAP BTP 上的 Java 微服务增添访问控制功能

Runtime.ImportModuleError 错误:找不到模块“axios/lib/utils”无服务器

Node.JS JavaScript socket.io 在微服务架构中发出消息

cpprest示例微服务链路嵌套调用层数1000以及跟踪

SpringCloud微服务(05):Zuul组件,实现路由网关控制

关于js实现微信,QQ,微博分享的总结