在嵌套回调函数中捕获AssertionError

时间:2016-01-04 21:50:42

标签: javascript node.js

我正在为Node.js编写更新的测试库,并且正在尝试正确捕获测试回调中发生的错误

由于某种原因,以下代码不会捕获AssertionError:

process.on('uncaughtException',function(err){
    console.error(err);  //an instance of AssertionError will show up here
});


[file1,file2,file2].forEach(function (file) {


        self.it('[test] ' + path.basename(file), {

            parallel:true

        },function testCallback(done) {

            var jsonDataForEnrichment = require(file);

            request({

                url: serverEndpoint,
                json: true,
                body: jsonDataForEnrichment,
                method: 'POST'

            }, function (error, response, body) {
                if (error) {
                    done(error);
                }
                else {
                    assert(response.statusCode == 201, "Error: Response Code"); //this throws an error, which is OK of course
                    done();
                }
            });
        });

    });

我处理回调(我将其命名为“testCallback”),使用以下代码:

                try {

                    if (!inDebugMode) {
                        var err = new Error('timed out - ' + test.cb);
                        var timer = setTimeout(function () {
                            test.timedOut = true;
                            cb(err);
                        }, 5000);
                    }

                    test.cb.apply({
                        data: test.data,
                        desc: test.desc,
                        testId: test.testId
                    }, [function (err) {   //this anonymous function is passed as the done functon
                        cb(err);
                    }]);
                }
                catch (err) {  //assertion error is not caught here
                    console.log(err.stack);
                    cb(err);
                }

我认为问题是由于在请求模块中生成的异步函数导致的回调不能通过简单的错误处理来捕获。 捕获该错误的最佳方法是什么?

我应该充实process.on('uncaughtException')处理程序吗?或者有更好的方法吗?

1 个答案:

答案 0 :(得分:0)

处理此问题的最佳方法似乎是Node.js域,一个核心模块

https://nodejs.org/api/domain.html

它可能会很快被弃用,但希望会有一个可以具有类似功能的替代品,因为域模块现在正在保存我的屁股,因为我没有其他方法可以捕获错误,因为可能会生成错误用我的用户代码,而不是我的代码。