从 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的主要内容,如果未能解决你的问题,请参考以下文章