当目录不为空时,会fs.rmdir抛出错误且没有堆栈跟踪:
{ [Error: ENOTEMPTY: directory not empty, rmdir '/var/folders/cv/fhzhp3gn/T/downloads']
errno: -66,
code: 'ENOTEMPTY',
syscall: 'rmdir',
path:
'/var/folders/cv/fhzhp3gn/T/downloads' }
Run Code Online (Sandbox Code Playgroud)
为了进行比较,我尝试显式抛出假错误,请参阅fake_delete_directory它显示堆栈跟踪(注意该/alex/projects/play.js:8:67行):
Error: some error
at Timeout.setTimeout [as _onTimeout] (/alex/projects/play.js:8:67)
at listOnTimeout (timers.js:324:15)
at processTimers (timers.js:268:5)
Run Code Online (Sandbox Code Playgroud)
代码:
const fs = require('fs')
function delete_directory(path) {
return new Promise((resolve, reject) => fs.rmdir(path, (err) => err ? reject(err) : resolve()))
}
function fake_delete_directory(path) {
return new Promise((resolve, reject) => setTimeout(() => reject(new Error("some error"), 1)))
}
const main = async () => {
const path = '/var/folders/cv/fhzhp3gn/T/downloads'
await delete_directory(path)
}
main().catch((e) => console.error(e))
Run Code Online (Sandbox Code Playgroud)
为什么fs.rmdir没有堆栈跟踪?以及如何添加呢?调试和追踪此类错误非常困难。
Node 的fs函数在没有堆栈跟踪的情况下抛出错误。这是设计使然,这里有一个问题跟踪器以获取更多信息: https: //github.com/nodejs/node/issues/30944
您可以使用第三方包(例如trace)来获取完整的堆栈跟踪。它仅适用于 Node.js v8.x 及更高版本。不过,您必须node使用一些额外的参数来启动:
node --stack_trace_limit=100 -r trace script.js
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
800 次 |
| 最近记录: |