Return 从 Promise 到 GraphQL 的数据

Return data to GraphQL from Promise

我在 return 将数据转换为 GraphQL 变更时遇到了一些问题。在突变中,您提供电子邮件和密码进行注册。从那里开始,GraphQL 应该 return 一个包含 usersId 的 JSON 网络令牌。

即使正在对密码进行哈希处理,并将电子邮件和密码保存到数据库中,并且 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 记录到控制台,但不会 return 它到 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)
          })
        })
    })
  })
}

正在关注

由于您的 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));
      });
    });

  });

}