Express中GraphQL查询单个User失败,返回全部用户问题求助
解决GraphQL查询单个用户却返回全部用户的问题
你的代码存在三个关键问题,导致查询返回所有用户:
1. Resolve函数参数接收错误
GraphQL的resolve函数第一个参数是父级数据(root),第二个才是传入的查询参数(args)。你直接把第一个参数当作userId,导致实际查询时where条件里的userId是undefined,TypeORM因此返回所有用户。
2. 返回类型定义错误
GET_USER的type设置为GraphQLList(UserType),这表示接口会返回用户数组,但你需要的是单个用户,应该改为UserType。
3. TypeORM查询方法选择不当
Users.find()返回的是符合条件的用户数组,获取单个用户应该使用findOneBy(TypeORM 0.3+版本)或findOne(旧版本),直接返回单个用户对象。
修正后的代码
import { GraphQLList, GraphQLID, GraphQLNonNull } from 'graphql'; import { UserType } from '../TypeDefs/User'; import { Users } from '../../Entities/Users'; export const GET_ALL_USERS = { type: new GraphQLList(UserType), resolve() { return Users.find(); }, }; export const GET_USER = { // 改为单个用户类型 type: UserType, args: { // 添加GraphQLNonNull确保参数必传,避免无参数时返回全部用户 userId: { type: new GraphQLNonNull(GraphQLID) }, }, // 正确接收参数:第一个为root(用_忽略),第二个为args async resolve(_: any, args: any) { const { userId } = args; // TypeORM 0.3+版本用findOneBy查询单个用户 const user = await Users.findOneBy({ userId: userId, }); return user; }, };
若使用TypeORM 0.2.x版本,替换查询逻辑为:
const user = await Users.findOne({ where: { userId: userId, }, });
修正后查询结果
执行原GraphiQL查询语句,会返回预期的单个用户:
{ "data": { "getUser": { "name": "Alicia", "email": "alicia@gmail.com", "userId": "2" } } }
内容的提问来源于stack exchange,提问作者Jesús Iasenzaniro
相关产品推荐
相关产品推荐

