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 undefined models 可能是未定义的,因为您在解析器的第一行中引用了它,但是如果没有看到完整的代码和完整的堆栈跟踪就很难确定 我使用了模型,因为它说在教程中我试图遵循。那应该是什么意思,我该如何进行完整的堆栈跟踪?抱歉,我是 graphql 的新手 您所遵循的示例假设您在上下文中注入了models。你如何做到这一点取决于你在后端使用什么来为 GraphQL 端点提供服务。不过,您现在应该可以跳过该步骤,直接在模块中导入模型。试试看它是否适合你。 否则,我想您的教程应该涵盖如何为您的 GraphQL 端点配置上下文。

以上是关于Graphql 的登录突变未找到用户的主要内容,如果未能解决你的问题,请参考以下文章

如何结合突变在 django-graphql-jwt 中创建或登录用户?

GraphQL 突变“在将标头发送到客户端后无法设置标头”

如何从graphql突变返回令牌

如何决定用于 GraphQL 突变的根值

GraphQL(Prisma)突变数据未定义

GraphQL 突变和查询:无法读取未定义的属性