将数据从Promise返回到GraphQL

时间:2017-06-14 07:01:49

标签: javascript node.js promise graphql graphql-js

我在将数据返回到GraphQL变异时遇到了一些麻烦。在变异中,您提供了一个用于注册的电子邮件和密码。从那里,GraphQL应返回包含usersId的JSON Web令牌。

即使正在对密码进行哈希处理,并且将电子邮件和密码保存到数据库中,并且使用用户ID作为有效负载来创建JWT,它也会以此响应

{
  "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
          })
      }
    }
  }
})

这是userType:

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

这里是signUp函数:

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)
          })
        })
    })
  })
}

1 个答案:

答案 0 :(得分:2)

关注javadoc

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

  });

}