带有 fs/promises 和 async..await 的堆栈跟踪

Est*_*ask 9 error-handling stack-trace fs node.js async-await

我有一个与此类似的问题,并在本期中进行了描述。与 async..await 一起使用时出现的错误中没有堆栈跟踪fs/promises,并且无法确定错误发生的位置。

鉴于应用程序:

foo.js

const { bar } = require('./bar');

async function foo() {
  await bar();
}


(async () => {
  await foo();
})().catch(console.error);
Run Code Online (Sandbox Code Playgroud)

酒吧.js

const fs = require('fs/promises');

exports.bar = async function bar() {
  await fs.readFile('some');
}
Run Code Online (Sandbox Code Playgroud)

当它像这样运行时node foo.js,这会导致没有堆栈跟踪的错误:

[Error: ENOENT: no such file or directory, open '...\some'] {
  errno: -4058,
  code: 'ENOENT',
  syscall: 'open',
  path: '...\\some'
}
Run Code Online (Sandbox Code Playgroud)

其中error.stack包含'ENOENT:没有这样的文件或目录,打开'...\some'。

当它像包node --stack_trace_limit=100 -r trace foo.js一样运行时trace,就像链接源中建议的那样,这会导致以下堆栈跟踪:

堆栈跟踪

请注意,内部条目呈灰色,可以过滤掉。

使用and包node --stack_trace_limit=100 -r trace -r clarify foo.js会产生以下输出:traceclarify

Error: ENOENT: no such file or directory, open '...\some'
    at ...\foo.js:8:2
    at Object.<anonymous> (...\foo.js:10:3) {
  errno: -4058,
  code: 'ENOENT',
  syscall: 'open',
  path: '...\\some',
  [Symbol(originalCallSite)]: [],
  [Symbol(mutatedCallSite)]: [ CallSite {}, CallSite {} ]
}
Run Code Online (Sandbox Code Playgroud)

问题是所有输出中均未提及bar.js。

我的目的是提供干净的错误输出,没有内部条目以及错误发生的确切位置,即 bar.js 中的行号。

这个问题有哪些可能的解决方案?

Lir*_*onZ 4

很近 :)

编辑:基于fs/promise 问题,这是一个已知问题,可以根据需要解决,如下所示。

此节点 --stack_trace_limit=100 -r trace -r 使用跟踪和澄清包澄清 foo.js 会产生以下输出:

错误:ENOENT:没有这样的文件或目录,请在对象处的 ...\foo.js:8:2 打开“...\some”。(...\foo.js:10:3) {
errno: -4058,
代码:'ENOENT',
系统调用:'open',
路径:'...\some',
[Symbol(originalCallSite)]: [] ,
[Symbol(mutatedCallSite)]: [ CallSite {}, CallSite {} ]
}

问题是所有输出中均未提及 bar.js。

除了使用trace/clarify之外,还可以直接在fs.readFile调用(bar.js)上进行try/catch

const fs = require('fs/promises');

exports.bar = async () => {
    try {
        await fs.readFile('some');
    } catch (e) {
        console.error(e);
    }
}
Run Code Online (Sandbox Code Playgroud)

$ node --stack_trace_limit=100 -r trace -r clarify foo.js
Error: ENOENT: no such file or directory, open 'some'
    at emitInitNative (node:internal/async_hooks:205:43)
    at emitInitNative (node:internal/async_hooks:205:43)
    at emitInitScript (node:internal/async_hooks:495:3)
    at promiseInitHook (node:internal/async_hooks:325:3)
    at promiseInitHookWithDestroyTracking (node:internal/async_hooks:329:3)
    at Object.readFile (node:internal/fs/promises:786:24)

    at exports.bar (/home/lz/code/stackover/bar.js:6:18)

    at foo (/home/lz/code/stackover/foo.js:4:11)
    at /home/lz/code/stackover/foo.js:9:15
    at Object.<anonymous> (/home/lz/code/stackover/foo.js:13:3)
    at Module._compile (node:internal/modules/cjs/loader:1101:14)
    at Object.Module._extensions..js (node:internal/modules/cjs/loader:1153:10)
    at Module.load (node:internal/modules/cjs/loader:981:32)
    at Function.Module._load (node:internal/modules/cjs/loader:822:12)
    at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:81:12)
    at node:internal/main/run_main_module:17:47 {
  errno: -2,
  code: 'ENOENT',
  syscall: 'open',
  path: 'some'
}
Run Code Online (Sandbox Code Playgroud)

您也可以尝试同步读取文件。