遍历我的主目录时导致 EPERM 错误的原因是什么?

问题描述 投票:0回答:2

我用谷歌搜索了

EPERM:不允许操作

我在 npm 问题和这个错误上遇到了很多问题。

这不是我的情况(不是重复的),因为我没有运行 npm,我正在运行我自己的 Node 代码。

我收到此错误:

错误

{ 
  Error: 'EPERM: operation not permitted',
  errno: -1,
  code: 'EPERM',
  syscall: 'scandir',
  path: '../../../Library/Application Support/CallHistoryDB/' 
};

在我的主目录上运行下面的代码时。

我使用两者来运行它

节点获取信息

sudo 节点 getInfo

但我遇到了同样的错误。

如果我在本地存储库上运行此代码,则它可以正常工作,但是当我尝试遍历整个主目录时,我会收到错误。

执行代码:

// Libraries
const fs = require('fs');
const h = require('./helper');

// Start recursing here
const start = '../../../';

// API
getThings(start).then(() => {
  console.log(data);
}).catch(h.error)

// Accesses the file system and returns an array of files / folders
async function getThings (folder) { 
  const things = await fs.promises.readdir(folder);
  for(let i = 0; i < things.length; i++) {
    await getStats(things[i], folder);
  }
}

// Gets statistics for each file/folder
async function getStats (thing, folder) {
  const path = folder + thing;
  const stats = await fs.promises.stat(path);
  await checkForFolder(stats, thing, path); 
}

// if the file/folder is a folder, recurse and do it again
async function checkForFolder(stats, thing, path){
  // logThing(stats, thing, path);
  if (stats.isDirectory() ) {
    await getThings(path + '/');
  }
}

研究

SO - EPERM 与 EACCES

javascript node.js macos recursion runtime-error
2个回答
3
投票
'../../../Library/Application Support/CallHistoryDB/' 

此路径受 macOS 安全设置保护,因为它可能包含敏感的电话历史记录数据。

如果您特别需要在 Node 应用程序中访问它,则需要在系统偏好设置中为用于运行此脚本的应用程序(例如 Terminal.app、iTerm 或 IDE)启用完全磁盘访问,如下所示如下所示。请注意,这将使您在终端中运行的“所有”应用程序访问您的敏感个人文件;小心行事。 但是,如果您不需要专门访问此路径(您可能不应该),更好的解决方案可能是在每次调用

fs.promises.stat(path)

时单独捕获错误。最简单的方法是将对

await fs.promises.stat(path)
的调用包装在
try … catch
块中,然后打印或忽略错误。


0
投票
vite serve

命令时,我突然收到此错误。这个命令一直工作正常,直到我对

vite.config.js
进行了更改,我将
root
键中包含的值更改为
/
,而不是之前的
./
值。我不知道确切的原因,但根据已接受答案的线索,我认为可能会发生这种情况。我正在公司的笔记本电脑上工作,我的项目文件夹位于根 C: 驱动器中。当
root
中的
vite.config.js
键值为
/
时,Vite 正在尝试导航到 C: 驱动器中的某个目录,普通用户(例如我的帐户)没有权限这样做。我的错误如下所示 -
> vite serve

node:internal/process/promises:289
            triggerUncaughtException(err, true /* fromPromise */);
            ^

[Error: EPERM: operation not permitted, scandir 'C:\PerfLogs'] {
  errno: -4048,
  code: 'EPERM',
  syscall: 'scandir',
  path: 'C:\\PerfLogs'
}

上述错误中的
errorno

与我的情况不同,但请注意路径

C:\\PerfLogs
。当我遍历到此路径并单击此文件夹时,我会看到下面 -

我希望它可以帮助面临类似许可问题的人。

© www.soinside.com 2019 - 2024. All rights reserved.