Node.js 在Axios捕获处理程序中的节点为12.x的AWS Lambda上引发异常

Node.js 在Axios捕获处理程序中的节点为12.x的AWS Lambda上引发异常,node.js,exception,aws-lambda,axios,Node.js,Exception,Aws Lambda,Axios,我很难理解如何使这个函数工作。我认为这源于我没有100%理解如何处理承诺,但我已经阅读了所有我能找到的教程,我仍然不知道我如何做到这一点 下面是一个函数,它调用API上的端点。当它成功时,它将返回一个令牌,以便在将来的请求中使用。当它失败时,我想抛出一个异常并完全停止执行 我听说,当像这样抛出一个catch处理程序时,抛出的异常由一个隐藏的try/catch处理,并传递给下一个catch处理程序。但这实际上意味着我的异常被黑洞了。我听说这是一件事,我在这个网站上读到了关于这件事的其他问题 实际的

我很难理解如何使这个函数工作。我认为这源于我没有100%理解如何处理承诺,但我已经阅读了所有我能找到的教程,我仍然不知道我如何做到这一点

下面是一个函数,它调用API上的端点。当它成功时,它将返回一个令牌,以便在将来的请求中使用。当它失败时,我想抛出一个异常并完全停止执行

我听说,当像这样抛出一个catch处理程序时,抛出的异常由一个隐藏的try/catch处理,并传递给下一个catch处理程序。但这实际上意味着我的异常被黑洞了。我听说这是一件事,我在这个网站上读到了关于这件事的其他问题

实际的例子并不是这么简单。但是有效的代码仍然是一样的,一个try/catch包住了所有有问题的代码。但任何例外都不会出现在正确的地方。然后lambda失败了,出现了一个异常。但是我写的代码没有处理它,所以响应是错误的。我需要处理代码并根据抛出的异常输出不同的回复。所以我改变它,修正数据,添加其他相关信息,然后返回。但是因为我从来没有在正确的地方着陆。我永远不能那样做

如何修改此函数,使其正确地到达我给出的异常处理程序中?谢谢你的帮助

    let getToken = async () => {
        let transport = axios.create({ baseURL, headers: passwordHeaders });

        return transport.post('/authorization/login')
            .then(response => {
                let accessToken = _.get(response, 'data.access_token', null);
                if(accessToken !== null){
                    let base64 = Buffer.from(accessToken, 'base64');
                    let token = base64.toString('ascii');

                    return token.split(";").shift().split(":").pop();
                }

                throw new LoginError(response.statusText, response.status));
            })
            .catch(error => {
                if(_.get(error, 'response.status', 'null') === 403){
                    throw new UnauthorizedError(error.response.statusText);
                }

                throw error;
            });
    }

    try{
        let token = await getToken();
    }catch(error){
        console.log("this exception should land here");
    }

如问题中所述,主要问题是
then
风格和
async
/
wait
的混合。如果我们采用
async
方法,我们可以做到以下几点:

让getToken=async()=>{
让transport=axios.create({baseURL});
试一试{
const response=wait transport.post(“/authorization/login”);
让accessToken=u.get(响应,“data.access_token”,null);
if(accessToken!==null){
让base64=Buffer.from(accessToken,“base64”);
让token=base64.toString(“ascii”);
返回标记.split(;).shift().split(:).pop();
}
}捕获(e){
投掷e;
}
};
试一试{
让令牌=等待getToken();
}捕获(错误){
log(“此异常应在此处登录”);
}

由于
getToken
是一个异步函数,它返回一个
Promise
,在这个函数中返回等于使用
Promise.resolve
,抛出等于
Promise.reject
。在我的例子中,
getToken
的catch块不做任何事情,getToken在
try/catch
中被调用。我们可能希望通过删除内部try-catch来将错误处理委托给外部try-catch。

为什么要同时使用async/wait和
.then()
呢?问题开始于
async
then
风格语法的混合
async
关键字使函数成为承诺。因此,getToken函数返回一个包含在承诺中的承诺。你可以删除
async
关键字,或者通过使用
await
来实际使用
async
关键字。是的,我理解编码,但我没有得到承诺。我使用
.then()
因为axios是这样工作的,所以使用
.then()
来处理API调用的结果。我想如果我返回结果,那就是一个承诺?但很明显,我只是不明白如何把这些放在一起。让我试试这些解决方案,看看它是否有效,但实际上并没有改变结果。我从函数中删除了异步。结果是catch仍然无法捕获从
.catch()
处理程序中抛出的内容。我认为问题仍然是异常仍然被
.catch()
处理程序隐藏。最后,我不得不在代码的各个级别上做更多的工作,以使其在应用程序中完全工作。但现在我得到了我需要的回应,再次感谢!我很高兴你让它运行起来了。祝你今天愉快:)