NestJS模块依赖注入异常:调用getUsers时出现undefined错误
我用命令nest g module UserModule在NestJS中创建了新模块,相关文件代码如下:
src/user-module/user.resolver.ts代码
import { Query, Resolver } from '@nestjs/graphql'; import { UserService } from './user.service'; export class UserResolver { constructor (private readonly user: UserService) { this.user = user; } @Query('users') async users() { return this.user.getUsers(); } }
src/user-module/user-module.module.ts代码
import { Module } from '@nestjs/common'; import { UserResolver } from './user.resolver'; import { UserService } from './user.service'; import { PrismaService } from './prisma.services'; @Module({ providers: [UserResolver, UserService, PrismaService] }) export class UserModuleModule {}
src/user-module/user.service.ts代码
import { Injectable } from "@nestjs/common"; import { PrismaService } from "./prisma.services"; import { User } from "src/graphql"; @Injectable() export class UserService { constructor(private readonly prisma: PrismaService) { } async getUsers(): Promise<User[]> { return this.prisma.prismaUsers.findMany({}) } }
src/user-module/prisma.services.ts代码
import { Injectable, OnModuleInit } from '@nestjs/common'; import { PrismaClient } from '@prisma/client'; @Injectable() export class PrismaService extends PrismaClient implements OnModuleInit { async onModuleInit() { await this.$connect(); } }
执行npm start启动服务后,运行以下GraphQL查询:
query { users { id name email } }
出现如下错误:
[Nest] 24682 - 09/09/2023, 10:59:34 AM ERROR [ExceptionsHandler] Cannot read properties of undefined (reading'getUsers')
TypeError: Cannot read properties of undefined (reading 'getUsers')
at UserResolver.users (/home/raj/Coding/ts/prisma-gql-express-demo/src/user-module/user.resolver.ts:12:22)
at /home/raj/Coding/ts/prisma-gql-express-demo/node_modules/@nestjs/core/helpers/external-context-creator.js:69:29)
at InterceptorsConsumer.intercept (/home/raj/Coding/ts/prisma-gql-express-demo/node_modules/@nestjs/core/interceptors/interceptors-consumer.js:12:20)
at target (/home/raj/Coding/ts/prisma-gql-express-demo/node_modules/@nestjs/core/helpers/external-context-creator.js:74:60)
at Object.users (/home/raj/Coding/ts/prisma-gql-express-demo/node_modules/@nestjs/core/helpers/external-proxy.js:9:30)
at field.resolve (/home/raj/Coding/ts/prisma-gql-express-demo/node_modules/@apollo/server/src/utils/schemaInstrumentation.ts:82:22)
at executeField (/home/raj/Coding/ts/prisma-gql-express-demo/node_modules/graphql/execution/execute.js:492:20)
at executeFields (/home/raj/Coding/ts/prisma-gql-express-demo/node_modules/graphql/execution/execute.js:414:22)
at executeOperation (/home/raj/Coding/ts/prisma-gql-express-demo/node_modules/graphql/execution/execute.js:344:14)
at execute (/home/raj/Coding/ts/prisma-gql-express-demo/node_modules/graphql/execution/execute.js:136:20)
请问我的依赖注入哪里出问题导致了这个错误?
错误核心原因是**UserResolver类缺少@Resolver()装饰器**:NestJS需要通过这个装饰器识别该类为GraphQL解析器,才能将其纳入依赖注入容器管理。没有这个装饰器的话,Nest无法正确注入UserService,导致this.user为undefined,调用getUsers()时抛出错误。
另外,构造函数里的this.user = user;属于多余代码——当你在构造函数参数中使用private readonly修饰符时,TypeScript会自动将参数赋值为类的属性,无需手动重复赋值。
修复后的user.resolver.ts代码如下:
import { Query, Resolver } from '@nestjs/graphql'; import { UserService } from './user.service'; // 添加@Resolver装饰器 @Resolver() export class UserResolver { // 移除多余的手动赋值代码 constructor (private readonly user: UserService) {} @Query('users') async users() { return this.user.getUsers(); } }
额外提醒:检查UserService中的prismaUsers是否符合Prisma生成的模型命名规范——通常Prisma会将模型名转为小写驼峰式(比如模型User对应user,查询方法为this.prisma.user.findMany({})),避免后续出现新的查询错误。
内容的提问来源于stack exchange,提问作者user51

