node.js catch块未按预期触发

时间:2019-04-03 13:47:31

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

我的节点进程在登录后退出

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

这里是否存在某些类型的故障? 提供兑现承诺的拒绝处理程序会更好吗?

谢谢, 布伦特

2 个答案:

答案 0 :(得分:0)

您正在将标准的承诺处理与 class Example extends React.Component { constructor(props) { super(props); this.state = { Item: 5, skip: 0 } this.handleClick = this.handleClick.bind(this); } urlParams() { return `http://localhost:3001/meetups?filter[limit]=${(this.state.Item)}&&filter[skip]=${this.state.skip}` } handleClick() { this.setState({skip: this.state.skip + 1}) } render() { return ( <div> <a href={this.urlParams()}>Example link</a> <pre>{this.urlParams()}</pre> <button onClick={this.handleClick}>Change link</button> </div> ) } } ReactDOM.render(<Example/>, document.querySelector('div#my-example' )) 样式的承诺处理混合在一起。您应该尝试使用其中之一,但不能同时使用两者。同时使用两种方法不受限制,但肯定会增加混乱。

这是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: {}
        };
    }
}

答案 1 :(得分:-1)

您没有使用async await,因为它应该使用

async await使代码能够等待Promise响应,然后继续下一步。其余端点返回的任何错误均由catch块捕获。

我在下面发布了示例代码,以说明async awaitpromise一起工作

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