GraphQL 总是返回 null
Posted
技术标签:
【中文标题】GraphQL 总是返回 null【英文标题】:GraphQL always return null 【发布时间】:2020-09-12 18:39:26 【问题描述】:我创建了一个关于用户创建的解析器和 graphql 文件。 数据类型好像合适,我有异步处理,但是结果总是返回null。我不知道为什么。
解析器 (createAccount.js)import prisma, generateToken, changePhoneNumber from "../../../utils";
import bcrypt from "bcryptjs";
export default
Mutation:
createAccount: async (_, args) =>
const
username,
password,
password2,
email,
phoneNum,
bio,
avatarUrl,
= args;
if (password !== password2)
throw new Error("two password aren't same each other");
const encryptPw = await bcrypt.hash(password, 10);
const newPhoneNumber = await changePhoneNumber(phoneNum, "+82");
const user = await prisma.user.create(
data:
username,
email,
password: encryptPw,
phoneNum: newPhoneNumber,
bio,
avatarUrl,
,
);
const token = generateToken(user.id);
return token, user ;
,
,
;
GraphQL 文件 (createAccount.graphql)
type Mutation
createAccount(
username: String!
email: String!
password: String!
password2: String!
phoneNum: String!
bio: String
avatarUrl: String
): AuthPayload!
type AuthPayload
token: String
user: User
utils.js
import PrismaClient from "@prisma/client";
import jwt from "jsonwebtoken";
export const prisma = new PrismaClient();
export const changePhoneNumber = (phoneNum, locationNum) =>
var leftStr = locationNum;
var rightStr = phoneNum.slice(1, phoneNum.length);
var newStr = leftStr + rightStr;
return newStr;
;
export const generateToken = (id) => jwt.sign( id , process.env.JWT_SECRET);
models.graphql
type User
id: ID!
avatarUrl: String
username: String!
email: String!
password: String!
phoneNum: String!
emailSecret: String
phoneSecret: String
bio: String
rooms: [Room]
createdAt: String
messages: [Message]
sender: [User]
receiver: [User]
我阅读了其他类似问题的答案,但大多数人说我应该适合数据类型或异步处理。 (Why does a GraphQL query return null?) 但是我的代码使用了异步处理的代码,我猜我匹配了数据类型。为什么这段代码总是返回 null? 另外,除了这个 Mutation 之外,所有其他 Query、Mutation 和 Subscriptions 都返回空值
【问题讨论】:
请创建一个stackblitz,以便我们仔细查看 在返回对象之前可能发生了一些错误 请编辑问题以显示createAccount.js
的导入方式以及您如何使用它创建解析器映射。
@YogeshDeveloper 对不起,我尝试了 stackblitz,但我无法带上 github,所以我留下了我的 github repo 地址。 link
@sdy 请查看我编辑的答案。问题归结为您在两个模块中导出的内容(函数而不是对象),这导致 mergeResolvers
返回函数而不是对象。
【参考方案1】:
根据错误,GraphQL 似乎根本没有为 createAccount
字段提供解析器。问题在于您如何合并解析器。这是你的代码:
const allTypes = fileLoader(path.join(__dirname, "api/**/*.graphql"));
const allResolvers = fileLoader(path.join(__dirname, "api/**/*.js"));
const schema = makeExecutableSchema(
typeDefs: mergeTypes(allTypes),
resolvers: mergeResolvers(allResolvers),
);
这是allResolvers
的结果值:
[ Query: TestQL: [Function: TestQL] ,
Mutation: addCategory: [Function: addCategory] ,
Mutation: deleteCategory: [Function: deleteCategory] ,
Mutation: editCategory: [Function: editCategory] ,
Mutation: newMessage: [Function: newMessage] ,
Subscription: subMessage: [Object] ,
[Function: _default],
Mutation: createRoom: [Function: createRoom] ,
[Function: _default],
Query: getRooms: [Function: getRooms] ,
Mutation: createAccount: [Function: createAccount] ,
Mutation: deleteUser: [Function: deleteUser] ,
Mutation: editProfile: [Function: editProfile] ,
Query: findEmail: [Function: findEmail] ,
Mutation: login: [Function: login] ,
Mutation: requestEmailSecret: [Function: requestEmailSecret] ,
Mutation: resetPassword: [Function: resetPassword] ,
Query: searchUser: [Function: searchUser] ,
Query: seeProfile: [Function: seeProfile] ]
您的两个模块导出一个函数而不是一个对象:
export default () => ...
因此,mergeResolvers
返回的结果最终是一个函数,而不是一个对象。因此,您根本没有向makeExecutableSchema
提供解析器映射。您需要修复这两个模块的默认导出,以便正确合并解析器。
【讨论】:
以上是关于GraphQL 总是返回 null的主要内容,如果未能解决你的问题,请参考以下文章
Nestjs - @nestjs/graphql GraphQLGatewayModule 总是返回错误请求
Nextjs graphql apollo 缓存总是返回 null
flutter_graphql 不起作用,并且在应用程序构建后总是返回 null
使用 graphql-tools、apollo-link-schema 和 react-hooks 在模拟时总是返回 undefined