首页 > 解决方案 > lstatSync() 返回未定义

问题描述

我绝对是 Node.js 的新手,我试图递归地删除文件夹中的所有文件,但是当使用 lstatSync(path) 时,它一直返回未定义。如果你好奇为什么这看起来很奇怪,而我正在使用 Materialize 和 JSX,那是因为这是 Electron 应用程序的一部分。

错误内容如下:

未捕获的 TypeError [ERR_INVALID_ARG_TYPE]:“路径”参数必须是字符串、缓冲区或 URL 类型之一。在 lstatSync 接收到未定义的类型

const sendFiles = (files) => {
            for (let file of files) {
                const stat = fs.lstatSync(file.path);

                // if file is a folder, recursively check each file in the nested folders
                if (stat.isDirectory()) {
                    // rename for clarity
                    let files = fs.readdirSync(file.path);
                    sendFiles(files);
                } else {
                    // notify user about incompatible file types
                    if (
                        file.path.split(".").pop() !== "js" &&
                        file.path.split(".").pop() !== "css" &&
                        file.path.split(".").pop() !== "html" &&
                        file.path.split(".").pop() !== "svg"
                    ) {
                        //materialize toast
                        M.toast({
                            html: `"${file.path
                                .split("/")
                                .pop()}" could not be minified due to incompatible file type.`,
                        });
                    } else {
                        //send to main process for minification
                        ipcRenderer.send("file:add", file.path);
                        setRedir(<Redirect to="/list" />);
                    }
                }
            }
        };

这是调用函数的地方:

document.ondrop = (e) => {
            sendFiles(e.dataTransfer.files);
            e.preventDefault();
        };

出现此问题是否有任何普遍的原因?正如我所说,我是 Node 新手,所以这里的某些事情可能完全超出了我的想象。

标签: javascriptnode.jsfs

解决方案


问题是在属性中返回一个具有完整文件名e.dataTransfer.files的对象数组,但返回一个只有文件名的数组而没有它们的路径。filepathfs.readdirSync

因此,第一次调用该sendFiles(files)函数时,每个函数file都有files一个path属性。

但是一旦它碰到一个文件夹并尝试递归调用自己,它就会传递一个没有路径的文件名列表。由于它需要文件对象,而不是简单的名称,它抱怨说file.pathundefined.

这是一个修改后的函数,它递归地记录所有拖放文件的完整文件名,包括拖放文件夹中的所有文件:

function sendFiles(files) {
  for (let file of files) {
    file = file.path || file;
    let folder;
    if (fs.lstatSync(file).isDirectory()) {
      let folder = file;
      let files = fs.readdirSync(folder).map(fileName => {
        return path.join(folder, fileName)
      });
      sendFiles(files);
    } else {
      console.log(file); // full filename with path
    }
  }
}

推荐阅读