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

如何从无服务器lambda内部抛出错误,lambda,graphql,serverless,apollo-server,Lambda,Graphql,Serverless,Apollo Server,有人能帮我理解如何在graphQL lambda应用程序中抛出身份验证错误吗?我正在将graphQL yoga与serverless一起使用,我可以对请求进行身份验证,并返回从jwt获得的用户,如果没有令牌,则返回{},或者如果令牌是旧的,则抛出身份验证错误。当我抛出一个错误时,它会在authenticate块的catch语句中被捕获,但我不知道如何从lambda实际返回该错误 const lambda = new GraphQLServerLambda({ typeDefs, cont

有人能帮我理解如何在graphQL lambda应用程序中抛出身份验证错误吗?我正在将graphQL yoga与serverless一起使用,我可以对请求进行身份验证,并返回从jwt获得的用户,如果没有令牌,则返回
{}
,或者如果令牌是旧的,则抛出身份验证错误。当我抛出一个错误时,它会在authenticate块的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...}
 });
如何格式化错误或从正确的位置抛出错误,以便获得实际的格式化错误?相反,我在JSON中得到了一个
意外的令牌I…
错误。显然,我需要在抛出
的过程中进行某种格式化,但我并不完全清楚该如何做

如果有帮助,请看我的出口部分。从try/catch到then/catch,我都在尝试,现在我似乎已经错过了捕捉错误的机会。有没有更好的办法?我需要的主要功能是对未登录的用户进行身份验证、拒绝坏令牌,或者只返回
{}
。我最难找到允许未登录用户的自定义授权程序,这就是我直接在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);
  }
};

自定义错误消息的一个选项是创建
error
类的新实例

例如:

.catch(e => {
  console.log('Caught the auth error here');
  throw new Error('Authentication Failed');
 }),
因为回调函数的第一个参数将是错误消息,所以您也可以将一般错误直接粘贴到处理函数中:

 callback("An error happened!");
您还可以使用中间件(如Middy)来帮助进行错误处理:

有关NodeJS错误处理的有用链接:


我终于找到了!下面是抛出、捕获和格式化在使用serverless的lambda函数中生成的错误的正确方法。诀窍是创建一个经过修改的回调函数,并将其传递到graphQL处理程序中。解析该函数后,它将运行您想要的任何代码

另外,Seanvm认为查看lambda函数的类型很重要,这是正确的-serverless默认设置代理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);
};

谢谢你的回复。我试着抛出错误,我可以得到500个错误,但没有别的。我想知道这是否是由于API网关的配置问题造成的。当我使用middy时,即使我抛出一个错误,将其放入middy回调(作为字符串、对象或字符串化对象),实际上我也会得到200个代码。您是否将自定义消息作为500个错误接收?还是一个一般的内部服务器错误?如果是前者,我相信您可以在消息中使用方括号设置自定义错误代码,如下所示:
callback(“[418]您的错误消息”)如果是后者,那么您可能需要再次检查是否使用带代理或不带代理的lambda集成-