如何 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 对象。或者在更简单的版本中,您是 throwing 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).