Skip to content

Exception handling inside async function #1019

@lonerr

Description

@lonerr

Hi,
It looks that erros happening in asynchronous functions somehow lose their stack.
Please check this minimal reproducible case:

load_module modules/ngx_http_js_module.so;

events {
    worker_connections 1024;
}

http {
    js_import err.js;

    server {
        location = /testAsync {
            js_content err.testAsync;
        }
        location = /testSync {
            js_content err.testSync;
        }
    }
}

The content of err.js is:

async function testAsync(r) {
    try {
        await ngx.fetch('http://127.0.0.1:12345');
    } catch(e) {
        r.return(200, `message: ${e.message}\nstack: ${e.stack}\n`);
    }
}

function testSync(r) {
    try {
        throw Error('oops');
    } catch(e) {
        r.return(200, `message: ${e.message}\nstack: ${e.stack}\n`);
    }
}

export default { testAsync, testSync }

This first result seems perfectly fine:

% curl 127.1/testSync
message: oops
stack: Error: oops
    at testSync (/conf/err.js:11)

But the second doesn't look so good:

% curl 127.1/testAsync
message: connect failed
stack: undefined

Please feel free to reach out to me for any additional details you may require.
Thank you in advance.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions