如何从无服务器 lambda 内部抛出错误

Coh*_*ent 5 lambda graphql apollo-server serverless

有人可以帮助我了解如何在 graphQL lambda 应用程序中抛出身份验证错误吗?我正在将 graphQL-yoga 与无服务器一起使用,我可以对请求进行身份验证,并返回我从 jwt 获得的用户,a{}表示没有令牌,或者如果令牌旧,则抛出身份验证错误。当我抛出一个错误时,它会在我的身份验证块的 catch 语句中被捕获,但我不知道如何从 lambda 实际返回它。

const lambda = new GraphQLServerLambda({
  typeDefs,
  context: ({ event, context }) =>
    authenticate(event.headers.Authorization)
      .then(user => ({ db: mainDb, user}))
      .catch(e => {
        console.log('Caught the auth error here');
        throw e;
      }),
   Query: { \\ some queries here.... },
   Mutation: { \\ some mutations here...}
 });
Run Code Online (Sandbox Code Playgroud)

我怎样才能格式化错误或从正确的位置抛出它,以便我得到一个实际的格式化错误?相反,我Unexpected token I in JSON...在客户端出现错误。显然,我需要在我的过程中进行某种格式化,throw但对我来说如何做到这一点并不完全显而易见。

如果有帮助,请在我的导出部分。我正在尝试从 try/catch 到 then/catch 的所有内容,此时我似乎已经错过了捕捉错误的机会。有没有更好的方法来做到这一点?我需要的主要功能是能够进行身份验证、拒绝错误令牌,否则只{}为未登录的用户返回 a 。我最难找到允许未登录用户的自定义授权方,这就是我直接在我的 graphQL 端点中进行身份验证的原因

exports.server = (event, context, callback) => {
  try {
    return lambda
      .graphqlHandler(event, context, callback)
      .then(b => b)
      .catch(e => console.log(`can't catch it here ${e}`));
  } catch (e) {
    console.log('or here');
    callback(e);
  }
};
Run Code Online (Sandbox Code Playgroud)

Coh*_*ent 3

我终于明白了!以下是抛出、捕获和格式化在无服务器的 lambda 函数中生成的错误的正确方法。诀窍是创建一个修改后的回调,并将其传递到 graphQL 处理程序中。当函数得到解析后,它将运行您想要的任何代码。

此外,Seanvm 是对的,研究 lambda 函数的类型很重要——无服务器默认设置一个代理 lambda 函数,这需要像我下​​面那样格式化输出,并将 null 作为错误传递。

exports.server = (event, context, callback) => {
  const modifiedCallback = (error, output) => {
    if (output.body.includes('401')) {
      callback(null, {
        statusCode: 401,
        headers: { 'Content-Type': 'application/javascript' },
        body: JSON.stringify({ message: 'Unauthorized' })
      });
    } else {
      callback(error, output);
    }
  };
  return lambda.graphqlHandler(event, context, modifiedCallback);
};
Run Code Online (Sandbox Code Playgroud)