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

时间:2019-05-18 23:11:36

标签: javascript node.js macos recursion runtime-error

我用谷歌搜索

  

EPERM:不允许操作

我在npm和此错误的问题上遇到了很多麻烦。

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

我收到此错误:

错误

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

在我的主目录中运行以下代码时。

我同时使用了它

  

节点getInfo

  

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 vs EACCES

1 个答案:

答案 0 :(得分:1)

'../../../Library/Application Support/CallHistoryDB/' 

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

如果您特别需要在Node应用程序中访问它,则需要在系统偏好设置中为正在运行该脚本的应用程序(例如Terminal.app,iTerm或IDE)启用完整磁盘访问。 , 如下所示。请注意,这将使您在终端中运行的所有应用程序可以访问您的敏感个人文件;小心地踩。

但是,如果您不需要专门访问此路径(并且您可能不需要),则更好的解决方案可能是在每次调用fs.promises.stat(path)时分别捕获错误。最简单的方法是将对await fs.promises.stat(path)的调用包装在try … catch块中,然后打印或忽略错误。

enter image description here