NodeJS - 错误堆栈跟踪中的错误行号

时间:2021-06-28 12:45:09

标签: javascript node.js error-handling stack-trace

有人可以解释(或更好地提供解决方案)为什么当我使用 async 函数时我的错误堆栈跟踪中有错误的数字?

class AsyncTest {
    async foo() {
        try {
            throw new Error("error msg1") // wrong stack trace
        } catch(e) {
            console.log(e)
        }
    }
}
const test = new AsyncTest();
test.foo()

----------

Error: error msg1
    at AsyncTest.<anonymous> (...path\dist\app.js:15:23)
    at Generator.next (<anonymous>)
    at ...path\dist\app.js:8:71
    at new Promise (<anonymous>)
    at __awaiter (...path\dist\app.js:4:12)
    at AsyncTest.foo (...path\dist\app.js:13:16)
    at Object.<anonymous> (...path\dist\app.js:24:6)
    at Module._compile (internal/modules/cjs/loader.js:1063:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1092:10)
    at Module.load (internal/modules/cjs/loader.js:928:32)

这是我在 ...path\dist\app.js 中构建的文件

"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
    return new (P || (P = Promise))(function (resolve, reject) {
        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
        step((generator = generator.apply(thisArg, _arguments || [])).next());
    });
};
class AsyncTest {
    foo() {
        return __awaiter(this, void 0, void 0, function* () {
            try {
                throw new Error("error msg1");
            }
            catch (e) {
                console.log(e);
            }
        });
    }
}
const test = new AsyncTest();
test.foo();
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vYXBwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFBQSxNQUFNLFNBQVM7SUFDTCxHQUFHOztZQUNMLElBQUk7Z0JBQ0EsTUFBTSxJQUFJLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQTthQUNoQztZQUFDLE9BQU0sQ0FBQyxFQUFFO2dCQUNQLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUE7YUFDakI7UUFDTCxDQUFDO0tBQUE7Q0FDSjtBQUVELE1BQU0sSUFBSSxHQUFHLElBQUksU0FBUyxFQUFFLENBQUM7QUFFN0IsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFBIn0=

我看到在这个文件中有一个变量 __awaiter,它将整个代码向下移动了几行。但是如何获得正确的堆栈跟踪?有什么建议吗?

谢谢。

1 个答案:

答案 0 :(得分:1)

您需要在启用源映射支持的情况下运行 nodejs。 一个完全做到这一点的图书馆是: https://www.npmjs.com/package/source-map-support

只需安装它并像这样导入:

import 'source-map-support/register'

并且您应该开始在堆栈跟踪中看到正确的行号。