为什么节点 fs.rmdir 错误中没有堆栈跟踪

Ale*_*hin 4 node.js

当目录不为空时,会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没有堆栈跟踪?以及如何添加呢?调试和追踪此类错误非常困难。

the*_*1st 5

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)