我在将数据返回到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)
})
})
})
})
}
答案 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));
});
});
});
}