Nestjs/GraphQL-playway为查询返回空错误。我的解析器?

Nestjs/GraphQL-playway为查询返回空错误。我的解析器?,graphql,nestjs,Graphql,Nestjs,“我的浏览器”中的“游乐场”很好地显示了Nestjs创建的模式,但查询返回null。我的代码有问题吗 "errors": [ { "message": "Cannot return null for non-nullable field Query.getUsers.", "locations": [ { "line": 2, "column": 3 } 这意味着找不到任何数据 schema.gra

“我的浏览器”中的“游乐场”很好地显示了Nestjs创建的模式,但查询返回null。我的代码有问题吗

"errors": [
    {
      "message": "Cannot return null for non-nullable field Query.getUsers.",
      "locations": [
        {
          "line": 2,
          "column": 3
    }
这意味着找不到任何数据

schema.graphql:

type UsersGQL {
    User_id: ID!
    first_name: String!
    last_name: String!
    main_skill_title: String!
    user_name: String!
    ....
}

type Query {
    getUser(user_id: ID!): UsersGQL!
    getUsers: [UsersGQL!]!
}
使用GraphQL在Nestjs中编译为GraphQL.schema.ts

export class UsersGQL {
    user_id: string;
    first_name: string;
    last_name: string;
    main_skill_title: string;
    user_name: string;
    ...
}

export abstract class IQuery {
    abstract getUser(user_id: string): UsersGQL | Promise<UsersGQL>;

    abstract getUsers(): UsersGQL[] | Promise<UsersGQL[]>;

    abstract temp__(): boolean | Promise<boolean>;
}
该服务对于我的NestJSRESTAPI很好。db是Postgres

users.service.ts

import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository, getManager, getRepository } from 'typeorm';
import { Members } from './members.entity';

@Injectable()
export class UsersService {

  private entityManager = getManager();

  constructor(
    @InjectRepository(Users)
    private readonly usersRepository: Repository<Users>
  ) {}

  async findAll(): Promise<Users[]> {
    return await this.usersRepository.find();
  }
}
返回的错误为:

{
  "errors": [
    {
      "message": "Cannot return null for non-nullable field Query.getUsers.",
      "locations": [
        {
          "line": 2,
          "column": 3
        }
      ],
      "path": [
        "getUsers"
      ],
      "extensions": {
        "code": "INTERNAL_SERVER_ERROR",
        "exception": {
          "stacktrace": [
             ...
  ],
  "data": null
}
编辑-添加users.module.ts、app.module.ts和ormconfig.json。整个模块是延迟加载的。REST和GraphQL在模块中并排出现。我还分离了REST和GQL组件

users.module.ts

import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';

// REST
import { UsersService } from './users.service';
import { UsersController } from './users.controller';
import { Users } from './users.entity';

// GraphQL
import { UsersResolvers } from './users.resolvers';

@Module({
  imports: [
    TypeOrmModule.forFeature([
      Users
      ]),
  ],
  providers: [
    UsersService,
    UsersResolvers
  ],
  controllers: [UsersController],
})

export class UsersModule {}
import { Module, NestModule, MiddlewareConsumer } from '@nestjs/common';

import { TypeOrmModule } from '@nestjs/typeorm';
import { GraphQLModule } from '@nestjs/graphql';
import { join } from 'path';

import { LoggerMiddleware } from './logger.middleware';

import { UsersModule } from './users/users.module';

import { UsersController } from './users/users.controller';



@Module({
  imports: [
    TypeOrmModule.forRoot(),
    GraphQLModule.forRoot({
      typePaths: ['./**/*.graphql'],
      definitions: {
        path: join(process.cwd(), 'src/graphql.schema.ts'),
        outputAs: 'class',
      },
      debug: true,
    }),
    UsersModule
  ],
  controllers: [
  ],
  exports: [
  ],
  providers: [
  ]
})

export class AppModule implements NestModule {
  configure(consumer: MiddlewareConsumer) {
    consumer
      .apply(LoggerMiddleware)
      .with('AppModule')
      .forRoutes(
        UsersController
    )};
}
app.module.ts

import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';

// REST
import { UsersService } from './users.service';
import { UsersController } from './users.controller';
import { Users } from './users.entity';

// GraphQL
import { UsersResolvers } from './users.resolvers';

@Module({
  imports: [
    TypeOrmModule.forFeature([
      Users
      ]),
  ],
  providers: [
    UsersService,
    UsersResolvers
  ],
  controllers: [UsersController],
})

export class UsersModule {}
import { Module, NestModule, MiddlewareConsumer } from '@nestjs/common';

import { TypeOrmModule } from '@nestjs/typeorm';
import { GraphQLModule } from '@nestjs/graphql';
import { join } from 'path';

import { LoggerMiddleware } from './logger.middleware';

import { UsersModule } from './users/users.module';

import { UsersController } from './users/users.controller';



@Module({
  imports: [
    TypeOrmModule.forRoot(),
    GraphQLModule.forRoot({
      typePaths: ['./**/*.graphql'],
      definitions: {
        path: join(process.cwd(), 'src/graphql.schema.ts'),
        outputAs: 'class',
      },
      debug: true,
    }),
    UsersModule
  ],
  controllers: [
  ],
  exports: [
  ],
  providers: [
  ]
})

export class AppModule implements NestModule {
  configure(consumer: MiddlewareConsumer) {
    consumer
      .apply(LoggerMiddleware)
      .with('AppModule')
      .forRoutes(
        UsersController
    )};
}
ormconfig.json

...
"entities": [
    "src/**/**.entity{.ts,.js}",
    // "src/graphql.schema.ts"  This doesn't work.  Must use REST entity.
  ],
...
您可能从“@nestjs/common”而不是“@nestjs/graphql”导入了@Query

确保有:

import { Query } from '@nestjs/graphql';
您可能从“@nestjs/common”而不是“@nestjs/graphql”导入了@Query

确保有:

import { Query } from '@nestjs/graphql';
TL;博士

您的模式已正确公开并可通过游乐场使用这一事实并不一定意味着所有相应的模块和解析器都集成到正在运行的嵌套应用程序中

我最近遇到了同样的错误,原因很简单:我忘记将包含解析器的模块导入根模块(通常是AppModule)

那么:您确定您已经将所有的UserModule模块依赖项以及最重要的UserResolver和UsersModule本身导入到您的AppModule中了吗

这里的技巧是,服务器公开的GraphQL模式直接从源文件生成。根据您的Nest GraphQL配置,它将编译所有的.GraphQL、.gql文件;或者,使用Nest v6的模块将读取所有源文件以查找其装饰器,并生成schema.gql。因此,即使没有解析请求的实际模块,也可以公开正确的模式

在我看来,这是框架中的一个错误行为,因为它无法在不提供任何解释的情况下解析您的模式。对于不可为null的字段Query.getUsers,获取的简单错误消息不能返回null。这是相当误导的,因为它隐藏了真正的失败,这是一个破碎的依赖关系

有关更多信息,请参阅相关的GitHub问题:

TL;博士

您的模式已正确公开并可通过游乐场使用这一事实并不一定意味着所有相应的模块和解析器都集成到正在运行的嵌套应用程序中

我最近遇到了同样的错误,原因很简单:我忘记将包含解析器的模块导入根模块(通常是AppModule)

那么:您确定您已经将所有的UserModule模块依赖项以及最重要的UserResolver和UsersModule本身导入到您的AppModule中了吗

这里的技巧是,服务器公开的GraphQL模式直接从源文件生成。根据您的Nest GraphQL配置,它将编译所有的.GraphQL、.gql文件;或者,使用Nest v6的模块将读取所有源文件以查找其装饰器,并生成schema.gql。因此,即使没有解析请求的实际模块,也可以公开正确的模式

在我看来,这是框架中的一个错误行为,因为它无法在不提供任何解释的情况下解析您的模式。对于不可为null的字段Query.getUsers,获取的简单错误消息不能返回null。这是相当误导的,因为它隐藏了真正的失败,这是一个破碎的依赖关系


有关更多信息,请参阅相关的GitHub问题:

此TypeORM体系结构的解决方案是使用TypeORM实体

users.resolvers.ts

import { Query, Resolver } from '@nestjs/graphql';
import { UsersService } from './users.service';

import { UsersGQL } from '../graphql.schema';
// import { UsersDTO } from './users.dto';


@Resolver('UsersGQL')
export class UsersResolvers {
  constructor(
    private readonly userService: UsersService
  ) {}

  @Query()
  async getUsers() {
    return await this.userService.findAll();
  }
}
import { Query, Resolver } from '@nestjs/graphql';
import { UsersService } from './users.service';
import { Users } from './users.entity';  // Here

@Resolver('Users')
export class UsersResolvers {
  constructor(
    private readonly userService: UsersService
  ) {}

  @Query()
  async getUsers() {
    return await this.userService.findAll();
  }
}

这种类型化体系结构的解决方案是使用类型化实体

users.resolvers.ts

import { Query, Resolver } from '@nestjs/graphql';
import { UsersService } from './users.service';

import { UsersGQL } from '../graphql.schema';
// import { UsersDTO } from './users.dto';


@Resolver('UsersGQL')
export class UsersResolvers {
  constructor(
    private readonly userService: UsersService
  ) {}

  @Query()
  async getUsers() {
    return await this.userService.findAll();
  }
}
import { Query, Resolver } from '@nestjs/graphql';
import { UsersService } from './users.service';
import { Users } from './users.entity';  // Here

@Resolver('Users')
export class UsersResolvers {
  constructor(
    private readonly userService: UsersService
  ) {}

  @Query()
  async getUsers() {
    return await this.userService.findAll();
  }
}

谢谢你,金姆,但我有这个权利。我以前发现过其他关于这个的帖子,所以我很小心。此外,我刚刚复制了Kamil的Github演示作品:-好吧,遗憾的是,这将是一个简单的修复方法您是否向服务中添加了console.log,并确保它被调用并且确实返回了一个非空数组?您的服务中也有一个拼写错误,但可能只是复制/粘贴:userssrepository我确实将console.log放在了我的服务和解析器中,但在IDE终端窗口中没有发生任何事情。我会尝试,但我必须了解代码先用沙箱。可能是明天,因为今天是妇女节,我的俄罗斯妻子想参加聚会:-我是美国人。所以如果你有一段时间没有我的消息,我不会抛弃你的。谢谢你,金姆,但我有这个权利。我以前发现过其他关于这个的帖子,所以我很小心。此外,我刚刚复制了Kamil的Github演示作品:-好吧,遗憾的是,这将是一个简单的修复方法您是否已将console.log添加到您的服务中,并确保它已被调用且确实存在
实际上返回一个非空数组?您的服务中也有一个输入错误,但这可能只是复制/粘贴:userssrepository我确实在我的服务和解析器中放置了console.log,但在IDE终端窗口中什么也没有发生。我会尝试,但我必须先了解代码沙盒。可能是明天,因为今天是妇女节,我的俄罗斯妻子想参加聚会:-我是美国人。因此,如果您有一段时间没有收到我的消息,我不会放弃您。如果我使查询为空,请删除,然后查询结果是{data:{getMembers:null}}这似乎意味着数据没有通过服务返回,而该服务目前对我的REST api运行良好,然后查询结果是{data:{getMembers:null}}这似乎意味着数据没有通过服务返回,而我的RESTAPI目前运行良好。谢谢@MarsLevin!是,members.module已作为延迟加载导入app.module。这就是在我尝试设置GraphQL之前REST代码工作良好的原因。此后,我对GraphQL组件进行了重构和分离,使其更容易进行故障排除。现在我可以让Nestjs编译了。我得到一个错误:找不到MembersGQL的存储库。看起来此实体未在当前默认连接中注册?我已经在我的原始帖子中添加了重构代码和模块以及部分ormconfig.json。有什么想法吗?我用它在操场上展示我的Postgres DB中的用户,但我不喜欢它必须使用REST实体。我想在转换完GraphQL后删除所有剩余的部分。谢谢@MarsLevin!是,members.module已作为延迟加载导入app.module。这就是在我尝试设置GraphQL之前REST代码工作良好的原因。此后,我对GraphQL组件进行了重构和分离,使其更容易进行故障排除。现在我可以让Nestjs编译了。我得到一个错误:找不到MembersGQL的存储库。看起来此实体未在当前默认连接中注册?我已经在我的原始帖子中添加了重构代码和模块以及部分ormconfig.json。有什么想法吗?我用它在操场上展示我的Postgres DB中的用户,但我不喜欢它必须使用REST实体。我想在转换到GraphQL之后删除所有剩余部分。