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

时间:2018-05-09 12:50:47

标签: lambda graphql serverless apollo-server

有人可以帮我理解如何在graphQL lambda app中抛出身份验证错误吗?我正在使用无服务器的graphQL-yoga,我可以验证请求并返回我从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...}
 });

如何格式化错误或从正确的位置抛出错误以便我得到实际的格式化错误?相反,我在客户端遇到Unexpected token I in JSON...错误。很明显,我需要在throw期间进行某种格式化,但对我来说,如何做到这一点并不是很明显。

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

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

2 个答案:

答案 0 :(得分:1)

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

一个例子是:

.catch(e => {
  console.log('Caught the auth error here');
  throw new Error('Authentication Failed');
 }),

因为回调函数的第一个参数将是错误消息,所以你也可以将一般错误直接粘贴到处理函数中:

 callback("An error happened!");

您还可以使用Middy等中间件来帮助处理错误:

https://github.com/middyjs/middy/blob/master/docs/middlewares.md#httperrorhandler

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

https://www.joyent.com/node-js/production/design/errors

答案 1 :(得分:0)

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

另外,Seanvm是正确的,查看lambda函数的类型很重要 - 无服务器默认设置一个proxy-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);
};