我有一个graphql
/ apollo-server
/ graphql-yoga
端点。该端点公开从数据库(或REST端点或其他服务)返回的数据。
我知道我的数据源正在返回正确的数据-如果将调用结果记录到解析器中的数据源,则可以看到正在返回的数据。但是,我的GraphQL字段始终解析为null。
如果我将该字段设为非空,则在响应中的errors
数组内会看到以下错误:
无法为不可为空的字段返回null
为什么GraphQL不返回数据?
答案 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);
}
}
然后,您可以返回空对象以进行查询。
答案 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 名称。