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));
});
});
});
}
我在 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));
});
});
});
}