如何从无服务器 lambda 中抛出错误
How to throw errors from inside a serverless lambda
有人可以帮助我了解如何在 graphQL lambda 应用程序中抛出身份验证错误吗?我将 graphQL-yoga 与无服务器一起使用,我可以对请求进行身份验证,或者 return 我从 jwt 获得的用户,{}
表示没有令牌,或者如果令牌是则抛出身份验证错误老的。当我抛出错误时,它会在我的身份验证块的 catch 语句中被捕获,但我不知道如何从 lambda 中实际 return。
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 的所有方法,此时我似乎已经错过了捕获错误的机会。有没有更好的方法来做到这一点?我需要的主要是能够验证、拒绝错误令牌,否则只是 return 一个 {}
用于未登录的用户。我很难找到允许未登录用户的自定义授权者,所以这就是为什么我直接在我的 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
class 的新实例。
例如:
.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 错误处理的有用 link:
我终于明白了!这是使用无服务器抛出、捕获和格式化在 lambda 函数中生成的错误的正确方法。诀窍是创建一个修改后的回调,该回调将传递到 graphQL 处理程序中。解析函数后,它将 运行 通过您想要的任何代码。
此外,Seanvm 是正确的,查看 lambda 函数的类型很重要 - serverless 默认设置一个 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);
};
有人可以帮助我了解如何在 graphQL lambda 应用程序中抛出身份验证错误吗?我将 graphQL-yoga 与无服务器一起使用,我可以对请求进行身份验证,或者 return 我从 jwt 获得的用户,{}
表示没有令牌,或者如果令牌是则抛出身份验证错误老的。当我抛出错误时,它会在我的身份验证块的 catch 语句中被捕获,但我不知道如何从 lambda 中实际 return。
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 的所有方法,此时我似乎已经错过了捕获错误的机会。有没有更好的方法来做到这一点?我需要的主要是能够验证、拒绝错误令牌,否则只是 return 一个 {}
用于未登录的用户。我很难找到允许未登录用户的自定义授权者,所以这就是为什么我直接在我的 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
class 的新实例。
例如:
.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 错误处理的有用 link:
我终于明白了!这是使用无服务器抛出、捕获和格式化在 lambda 函数中生成的错误的正确方法。诀窍是创建一个修改后的回调,该回调将传递到 graphQL 处理程序中。解析函数后,它将 运行 通过您想要的任何代码。
此外,Seanvm 是正确的,查看 lambda 函数的类型很重要 - serverless 默认设置一个 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);
};