从 Promise 返回数据到 GraphQL

Posted

技术标签:

【中文标题】从 Promise 返回数据到 GraphQL【英文标题】:Return data to GraphQL from Promise 【发布时间】:2017-11-16 04:30:57 【问题描述】:

我在将数据返回到 GraphQL 突变时遇到了一些问题。在突变中,您提供电子邮件和密码进行注册。从那里,GraphQL 应该返回一个包含 usersId 的 JSON Web 令牌。

即使密码被散列并且电子邮件和密码被保存到数据库中,并且 JWT 是使用用户 ID 作为有效负载制作的,它也会用这个来响应


  "data": 
    "signUp": 
      "token": null,
      "email": null
    
  

这是 GraphQL 查询:

mutation 
  signUp(email: "johndoe@example.com", password: "password") 
    token //Should return a JWT
    email // Should return the users email address
  

这是突变:(运行突变时,它将 JWT 记录到控制台,但不会将其返回到 GraphQL)

const mutation = new GraphQLObjectType(
  name: 'Mutation',
  fields: 
    signUp: 
      type: UserType,
      args: 
        email:  type:  new GraphQLNonNull(GraphQLString) ,
        password:  type: new GraphQLNonNull(GraphQLString) 
      ,
      resolve (parentValue, args) 
        return signUp(args) // Calls a function in another file with the args
          .then((result) => 
            console.log(result) // Logs the JWT to the console.
            return result
          )
      
    
  
)

这里是用户类型:

const UserType = new GraphQLObjectType(
  name: 'UserType',
  fields: 
    id:  type: GraphQLID ,
    email:  type: GraphQLString ,
    token:  type: GraphQLString 
  
)

这里是注册功能:

function signUp ( email, password ) 
  return new Promise((resolve, reject) => 
    bcrypt.hash(password, 10, function(err, password) 
      const userKey = datastore.key('User')
      const entity = 
        key: userKey,
        data: 
          email,
          password
        
      

      datastore.insert(entity)
        .then(() => 
          let userId = userKey.path[1]
          jwt.sign(userId, 'secret', function (err, token) 
            resolve(token)
          )
        )
    )
  )

【问题讨论】:

据我了解,您的结果变量是 JWT ?所以它是一个字符串? 非常感谢您的帮助。我只需要像这样在一个对象中返回 JWT:return "token": result 【参考方案1】:

关注your comment:

由于您的signUp 突变属于UserType,因此您不应使用 token: ... 对象解决它,而应使用User 对象解决它。这将允许您在执行突变时查询用户上的其他字段。

按照您的示例,可能是:

function signUp ( email, password ) 
  return new Promise((resolve, reject) => 

    bcrypt.hash(password, 10, function(err, password) 
      if (err) return reject(err);

      const userKey = datastore.key('User')
      const userId = userKey.path[1];

      jwt.sign(userId, 'secret', function (err, token) 
        if (err) return reject(err);

        const entity = 
          key: userKey,
          data: 
            email,
            password,
            token,
          ,
        ;

        datastore.insert(entity)
          .then(inserted => resolve(inserted));
      );
    );

  );


【讨论】:

感谢您的所有帮助。对此,我真的非常感激。当您分配 userId 的值时,它是未定义的。我相信您需要在将实体插入数据存储区后进行分配。 OK :) 我不知道您正在使用的商店的详细信息。您是否能够修改我发布的代码以使其正常工作?一般的想法是简单地返回插入的实体 - 你应该能够这样做;) 没关系。我能够让它工作。感谢所有的帮助。

以上是关于从 Promise 返回数据到 GraphQL的主要内容,如果未能解决你的问题,请参考以下文章

从 GraphQL-Java 返回错误

如何从 GraphQL 突变返回数据?

GraphQL从axios返回空数据[重复]

GraphQL:从兄弟解析器访问另一个解析器/字段输出

当我从等待移动到 Promise.all 时,TypeScript 函数返回类型错误

Angular - 从 GraphQL 返回数据