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 中的行号。
这个问题有哪些可能的解决方案?
很近 :)
编辑:基于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)
您也可以尝试同步读取文件。
| 归档时间: |
|
| 查看次数: |
1637 次 |
| 最近记录: |