node.js - 如何从graphql中的解析器返回自定义对象?
问题描述
我有 nodejs 和 graphql 应用程序。
我的用户架构和解析器使用graphql-compose-mongoose
:
import { composeWithMongoose } from 'graphql-compose-mongoose';
const UserTC = composeWithMongoose(User, {
fields: { remove: ['password'] },
});
UserTC.addResolver({
name: 'currentUser',
type: UserTC.getType(),
resolve: currentUserResolver, // return user object...
});
我将解析器添加到我的 UserTC:
UserTC.addResolver({
name: 'login',
args: {
email: { type: 'String!' },
password: { type: 'String!' },
},
type: /// <---- MISSING TYPE HERE
resolve: async ({ args, context }) => {
const { email, password } = args;
const { token, user } = login({ email, password });
return { token, user }
},
});
我需要为这个解析器返回 { token, user }。
我应该定义什么类型?
我尝试但失败了:
type: { token: 'String', user: UserTC.getType() }
解决方案
我不知道您是否已经解决了这个问题,但是通过这种方式您可以定义您将用作Args的内容以及可以在解析器中公开哪些字段
const { schemaComposer, toInputObjectType } = require('graphql-compose');
const MyCustomAuth = schemaComposer.createObjectTC({
name: 'Login',
fields: {
// Args
username: 'String!',
password: 'String!',
// Fields to return
email: 'String',
city: 'String',
token: 'String'
}
});
const MyCustomAuthITC = toInputObjectType(MyCustomAuth);
这是一个使用JWT的示例
UserTC.addResolver({
kind: 'mutation',
name: 'Auth',
// Your Custom Object
type: MyCustomAuth,
args: {
// Here goes the Input
input: MyCustomAuthITC
},
resolve: async ({args}) => {
return new Promise( async (resolve, reject) => {
const { username, password } = args.input;
//Get user by username
const user = await User.findOne({username});
if (!user) reject('Authentication Failed');
const token = jwt.sign(user.toJSON(), config.JWT_SECRET, {
expiresIn: '1h',
subject: user.id
});
resolve({
email: user.email,
city: user.email,
token: token
});
});
}
});
现在你需要在这样的地方调用解析器login: UserTC.getResolver('Auth')
推荐阅读
- php - 无法通过 Amazon CloudFront 发送请求:403 错误
- r - 在 R 中形成一个尺寸为 100x100 的矩阵 (a^|ij|)
- python - 将多行和多列的文本连接成熊猫数据框中的单个文本字符串?
- angular - 如何将复杂的 JSON 数据绑定到剑道网格 Angular?
- reactjs - Gutenberg RichText 自定义块属性。“数组和子项”还是“字符串和 HTML”?
- javascript - 在反应中多次触发去抖动
- javascript - 使用 JavaScript 的 url 发送 laravel ( app()->getLocale() )
- rabbitmq - rabbitmq 流控制日志记录
- linux - Bash Script如何逐个显示文件名
- php - 在php中转换数字列表