如何 return 拒绝对 Graphql 的承诺?
How to return a rejected Promise to Graphql?
我有一个 login
方法,它 return 是对 GraphQL 的承诺来解决。如果找到并验证了用户,它会解析用户并正常工作。但是,如果该帐户不存在或无法解析,则承诺会被拒绝并显示一条消息 Invalid credentials.
这很好,但是当发生这种情况时我似乎遇到了 GraphQL 错误,所以我想我是发送 GraphQL 一些它不期望的东西。
这是我的代码:
mutations.js:
login: {
type: UserType,
args: {
email: { type: GraphQLString },
password: { type: GraphQLString }
},
resolve(parentValue, { email, password }, req) {
return AuthService.login({ email, password, req })
}
}
AuthService.login:
function login({ email, password, req }) {
return new Promise((resolve, reject) => {
passport.authenticate('local', (err, user) => {
if (!user) { reject('Invalid credentials.') }
req.login(user, () => resolve(user));
})({ body: { email, password } });
});
}
我返回的 GraphQL 错误是这样的:
{
"errors": [
{
"message": "Unexpected error value: \"Invalid credentials.\"",
"locations": [
{
"line": 2,
"column": 3
}
],
"path": [
"login"
]
}
],
"data": {
"login": null
}
}
但我想如果我 return 正确地 GraphQLFieldResolver
不会得到更简单的错误结果吗?就像一个数组或(在本例中是一个数组)错误消息?
例如,假设我将解析器更改为:
resolve(parentValue, { email, password }, req) {
throw "Error!"
// return AuthService.login({ email, password, req })
}
我收到错误消息 "message": "Unexpected error value: \"Error!\""
。我不应该得到 "message": "Error!"
吗? return 带有 Unexpected error value: X
的错误消息是 GraphQL 标准吗?
问题是您返回的承诺被字符串拒绝,而不是 Error
对象。或者在更简单的版本中,您是 throw
ing a string instead of an Error
object.
只是不要那样做。
我怀疑 GraphQL 标准中有关于此的内容(毕竟,这是实现而不是 API 协议),它只是 graphql.js期待 Error
对象(以便它可以在开发模式下发送堆栈跟踪等)并抱怨非 Error
异常并显示“ 意外错误值 ” 消息。
要修复您的代码,请使用
function login({ email, password, req }) {
return new Promise((resolve, reject) => {
passport.authenticate('local', (err, user) => {
if (!user) { reject(new Error('Invalid credentials.')) }
// ^^^^^^^^^^ ^
req.login(user, () => resolve(user));
})({ body: { email, password } });
});
}
甚至更好 reject(err)
.
我有一个 login
方法,它 return 是对 GraphQL 的承诺来解决。如果找到并验证了用户,它会解析用户并正常工作。但是,如果该帐户不存在或无法解析,则承诺会被拒绝并显示一条消息 Invalid credentials.
这很好,但是当发生这种情况时我似乎遇到了 GraphQL 错误,所以我想我是发送 GraphQL 一些它不期望的东西。
这是我的代码: mutations.js:
login: {
type: UserType,
args: {
email: { type: GraphQLString },
password: { type: GraphQLString }
},
resolve(parentValue, { email, password }, req) {
return AuthService.login({ email, password, req })
}
}
AuthService.login:
function login({ email, password, req }) {
return new Promise((resolve, reject) => {
passport.authenticate('local', (err, user) => {
if (!user) { reject('Invalid credentials.') }
req.login(user, () => resolve(user));
})({ body: { email, password } });
});
}
我返回的 GraphQL 错误是这样的:
{
"errors": [
{
"message": "Unexpected error value: \"Invalid credentials.\"",
"locations": [
{
"line": 2,
"column": 3
}
],
"path": [
"login"
]
}
],
"data": {
"login": null
}
}
但我想如果我 return 正确地 GraphQLFieldResolver
不会得到更简单的错误结果吗?就像一个数组或(在本例中是一个数组)错误消息?
例如,假设我将解析器更改为:
resolve(parentValue, { email, password }, req) {
throw "Error!"
// return AuthService.login({ email, password, req })
}
我收到错误消息 "message": "Unexpected error value: \"Error!\""
。我不应该得到 "message": "Error!"
吗? return 带有 Unexpected error value: X
的错误消息是 GraphQL 标准吗?
问题是您返回的承诺被字符串拒绝,而不是 Error
对象。或者在更简单的版本中,您是 throw
ing a string instead of an Error
object.
只是不要那样做。
我怀疑 GraphQL 标准中有关于此的内容(毕竟,这是实现而不是 API 协议),它只是 graphql.js期待 Error
对象(以便它可以在开发模式下发送堆栈跟踪等)并抱怨非 Error
异常并显示“ 意外错误值 ” 消息。
要修复您的代码,请使用
function login({ email, password, req }) {
return new Promise((resolve, reject) => {
passport.authenticate('local', (err, user) => {
if (!user) { reject(new Error('Invalid credentials.')) }
// ^^^^^^^^^^ ^
req.login(user, () => resolve(user));
})({ body: { email, password } });
});
}
甚至更好 reject(err)
.