graphql - GraphQL 总是返回 null
问题描述
我创建了一个关于用户创建的解析器和 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
}
- 实用程序.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);
- 模型.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]
}
我阅读了其他类似问题的答案,但大多数人说我应该适合数据类型或异步处理。
(为什么 GraphQL 查询返回 null?)
但是我的代码使用了异步处理的代码,我猜我匹配了数据类型。为什么这段代码总是返回 null?
此外,除了这个 Mutation,所有其他 Query、Mutation 和 Subscriptions 都返回空值
解决方案
根据该错误,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
. 您需要修复这两个模块的默认导出,以便正确合并解析器。
推荐阅读
- database - PostgreSQL join 显示重复
- ftp - 如何使用 FTP 在 android studio 中使用 Kotlin 上传小文件或图像
- python - Pandas - 在 for 循环中附加具有不同列的 DataFrame
- virtualbox - 如何在 Virtualbox (Windows 10) 中创建桥接连接
- c# - c#在foreach循环中增加int变量
- vba - 运行时错误“-2147352567 (80020009)”:数据已更改
- php - 有没有办法在一个 data.php 文件中进行多个查询?
- php - 无法测试引用模拟方法 PHPUnit 的方法
- python-3.x - 使用 Python 加速 Windows 注册表的转储过程
- java - 表达式树