node.js catch block 在等待时未按预期触发

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

我的 Node 进程在登录后退出

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 on the promise 中提供拒绝处理程序会更好吗?

谢谢, 布伦特

最佳答案

您将标准 promise 处理与 async/await 风格的 promise 处理混合在一起。您应该尝试使用其中之一,但不能同时使用两者。同时使用这两种方法不受限制,但肯定会增加困惑。

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

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

标准的 promise 处理应该是这样的:

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

关于node.js catch block 在等待时未按预期触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55496746/

相关文章:

node.js - 如何安全地将 Google OAuth 生成的访问 token 传递到 NodeJS REST API?

typescript - 在 Typescript 中定义数组的接口(interface)

javascript - Promise 不在 Typescript 中编译

javascript - Promises 相对于 CPS 和 Continuation Functor/Monad 有哪些优势?

node.js - MongoDB/Node.js-mongoose-text-search 中的全文搜索

javascript - 如何使用nodejs实现分段文件上传代理?

javascript - 一个服务器文件中的多个 Node.js "Apps"坏习惯?

javascript - 是否可以在没有服务器的情况下从客户端应用程序中的 API GITHUB 获取 token 和 client_id ?

Angular 2 : Global Guard (user has to be logged in always)

javascript - 在 promise 链中容纳 Q.all