【问题标题】:node.js catch block not firing as expected on awaitnode.js catch 块在等待时未按预期触发
【发布时间】:2019-04-04 00:12:45
【问题描述】:

登录后我的节点进程退出

E    callback: [Function: RP$callback],
E    { serviceName: '....',
E    errno: 'EAI_AGAIN',
E    name: 'RequestError',

但我认为下面的代码会捕获异常并返回默认值

var rp = require('request-promise');

async function verifyJWT(jwt: string): Promise<any> {

    const userDataPromise = rp({
        uri: ...,
        method: 'POST',
        json: {
            ...
        }
    });
    const userData = await userDataPromise.catch((err: any) => {
        console.error(`verifyJWT: err`, err)
        return {
            authInfo: {}
        };
    });
    return userData;
}

export default verifyJWT

是否有某些类型的故障不会在这里被捕获? 提供一个拒绝处理程序会更好吗?

谢谢, 布伦特

【问题讨论】:

  • 感谢您的回答!我对我在那里输入的内容感到困惑;并将更新为与 catch 块异步。然而;我仍然不清楚为什么未来的捕获没有捕获错误;为什么我的节点进程退出了?

标签: node.js typescript promise async-await request-promise


【解决方案1】:

您将标准承诺处理与async/await 样式承诺处理混合在一起。您应该尝试使用其中之一,但不能同时使用两者。同时使用这两种方法没有限制,但肯定会增加混乱。

async/await 风格的承诺处理应该是这样的:

async function verifyJWT(jwt: string): Promise<any> {
    try {
        return await rp({
            uri: ...,
            method: 'POST',
            json: {
                ...
            }
        });
    } catch (err) {
        console.error(`verifyJWT: err`, err);
        return {
            authInfo: {}
        };
    }
}

这就是标准的承诺处理应该是这样的:

function verifyJWT(jwt: string): Promise<any> {
    return rp({
        uri: ...,
        method: 'POST',
        json: {
            ...
        }
    }).catch((err: any) => {
        console.error(`verifyJWT: err`, err);
        return {
            authInfo: {}
        };
    });
}

【讨论】:

    【解决方案2】:

    你没有使用应该使用的async await

    async await 使代码等待承诺响应,然后继续下一步。其余端点返回的任何错误都被 catch 块捕获。

    我在下面发布了一个示例代码,以展示 async await 如何与 promise 一起使用

    var rp = require('request-promise');
    
    var myfun = async ()=>{
        let returnValue = null;
        try{
            let response = await rp("http://localhost:3000/getdata");
            console.log("ajax success");
            returnValue = response;
        }
        catch(err){
            console.log("ajax error ",err.message)
            returnValue = err.message;
        }
        return returnValue;
    }
    

    注意如果要从async函数返回任何数据,那么调用函数也应该是async,并且在调用时必须使用await

    Read more 关于async await

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-29
      • 1970-01-01
      • 2012-02-10
      • 2016-01-23
      • 1970-01-01
      • 2011-12-15
      • 2019-04-09
      相关资源
      最近更新 更多