为什么GraphQL查询返回null?

时间:2019-05-27 02:53:41

标签: graphql graphql-js apollo-server

我有一个graphql / apollo-server / graphql-yoga端点。该端点公开从数据库(或REST端点或其他服务)返回的数据。

我知道我的数据源正在返回正确的数据-如果将调用结果记录到解析器中的数据源,则可以看到正在返回的数据。但是,我的GraphQL字段始终解析为null。

如果我将该字段设为非空,则在响应中的errors数组内会看到以下错误:

  

无法为不可为空的字段返回null

为什么GraphQL不返回数据?

3 个答案:

答案 0 :(得分:0)

我在Nest.js上遇到了同样的问题。

如果您想解决问题。您可以将{nullable:true}选项添加到@Query装饰器中。

这是一个例子。

@Resolver(of => Team)
export class TeamResolver {
  constructor(
    private readonly teamService: TeamService,
    private readonly memberService: MemberService,
  ) {}

  @Query(returns => Team, { name: 'team', nullable: true })
  @UseGuards(GqlAuthGuard)
  async get(@Args('id') id: string) {
    return this.teamService.findOne(id);
  }
}

然后,您可以返回空对象以进行查询。

enter image description here

答案 1 :(得分:0)

如果上述方法均无济于事,并且您有一个全局拦截器将所有响应封装在例如“数据”字段内,则必须为graphql禁用此功能,否则将graphql解析器转换为null。

这是我对案件的拦截者所做的:

  intercept(
    context: ExecutionContext,
    next: CallHandler,
  ): Observable<Response<T>> {
    if (context['contextType'] === 'graphql') return next.handle();

    return next
      .handle()
      .pipe(map(data => {
        return {
          data: isObject(data) ? this.transformResponse(data) : data
        };
      }));
  }

答案 2 :(得分:0)

如果有人使用了 apollo-server-express 并获得了空值。

const typeDefs = require('./schema');
const resolvers = require('./resolver');

const server = new ApolloServer({typeDefs,resolvers});

这将按照您的预期返回值。

const withDifferentVarNameSchema = require('./schema');
const withDifferentVarNameResolver= require('./resolver');

const server = new ApolloServer({withDifferentVarNameSchema,withDifferentVarNameResolver});

这将不会像预期的那样返回 null。

注意:在创建 Apolloserver 的实例时,只传递 typeDefs 和解析器 var 名称。