Graphql 的登录突变未找到用户
Posted
技术标签:
【中文标题】Graphql 的登录突变未找到用户【英文标题】:Login Mutation for Graphql not finding user 【发布时间】:2019-07-11 04:54:14 【问题描述】:我正在尝试使用 graphql 和 mongodb 创建身份验证服务。我已经创建了我的登录突变,它接受了电子邮件和密码。我正在使用 bcrypt 对密码进行哈希处理和取消哈希处理。
这不是导入问题或 mongodb 问题,而是 graphql。
const UserType = new GraphQLObjectType(
name: 'User',
fields: () => (
id: type: GraphQLID,
username: type: GraphQLString,
email: type: GraphQLString,
password: type: GraphQLString,
institution:
type: InstitutionType,
resolve(parent, args)
return Institution.findById(parent.institutionId)
)
);
login:
type:GraphQLString,
args:
email: type: GraphQLString,
password: type: GraphQLString
,
resolve: async (parent, email, password , models, SECRET ) =>
const user = await models.User.findOne( where: email );
if (!user)
throw new Error('No user with that email');
const valid = await bcrypt.compare(password, user.password);
if (!valid)
throw new Error('Incorrect password');
const token = jwt.sign(
user: _.pick(user, ['id', 'username']),
,
SECRET,
expiresIn: '1y',
,
);
return token;
,
,
);
它应该返回一个 jwt 令牌,以后可以用于身份验证。首先,我在浏览器的 graphiql 中运行它:
mutation
login(email: "ammarthayani@gmail.com", password:"password")
它在控制台中给了我这个:“语法错误:预期名称,找到了
然后我尝试了:
mutation
login(email: "ammarthayani@gmail.com", password:"password")
username
这给了我:字段 \"login\" 不能有选择,因为类型 \"String\" 没有子字段。
【问题讨论】:
【参考方案1】:Mutation
类型上的 login
字段的类型是 GraphQLString
,它是一个标量。由于标量是叶节点,它们没有选择集(即其他“子”字段)。 From the spec:
如果 selectionType 是标量或枚举:
该选择的子选择集必须为空如果 selectionType 是接口、联合或对象
该选择的子选择集不得为空
花括号用于表示选择集,因此当字段的返回类型是标量或枚举时,不应使用它们。您的查询需要简单:
mutation
login(email: "ammarthayani@gmail.com", password:"password")
【讨论】:
当我运行它时它返回:Cannot read property User of undefinedmodels
可能是未定义的,因为您在解析器的第一行中引用了它,但是如果没有看到完整的代码和完整的堆栈跟踪就很难确定
我使用了模型,因为它说在教程中我试图遵循。那应该是什么意思,我该如何进行完整的堆栈跟踪?抱歉,我是 graphql 的新手
您所遵循的示例假设您在上下文中注入了models
。你如何做到这一点取决于你在后端使用什么来为 GraphQL 端点提供服务。不过,您现在应该可以跳过该步骤,直接在模块中导入模型。试试看它是否适合你。
否则,我想您的教程应该涵盖如何为您的 GraphQL 端点配置上下文。以上是关于Graphql 的登录突变未找到用户的主要内容,如果未能解决你的问题,请参考以下文章