在嵌套 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 在微服务架构中发出消息