【问题标题】:ENOENT, no such file or directory on fs.mkdirSyncENOENT,fs.mkdirSync 上没有这样的文件或目录
【发布时间】:2015-04-14 10:01:57
【问题描述】:

我目前正在启动我的 NodeJS 应用程序,并且我有以下 if 语句:

Error: ENOENT, no such file or directory './realworks/objects/'
    at Object.fs.mkdirSync (fs.js:654:18)
    at Object.module.exports.StartScript (/home/nodeusr/huizenier.nl/realworks.js:294:7)

然而,奇怪的是该文件夹已经存在,但是在以下 sn-p 上检查失败:

if(fs.existsSync(objectPath)) {
    var existingObjects = fs.readdirSync(objectPath);
    existingObjects.forEach(function (objectFile) {
        var object = JSON.parse(fs.readFileSync(objectPath+objectFile));
        actualObjects[object.ObjectCode] = object;
    });
}else{
    fs.mkdirSync(objectPath); // << this is line 294
}

我不明白在创建目录时no such file or directory 是如何出现的。

【问题讨论】:

  • 让我看看你的objectPath,请
  • 对象路径是错误返回的,./realworks/objects/
  • 您是否尝试递归地创建这些目录? fs.mkdir() 不能或不能这样做。我的猜测是文件夹“realworks”还不存在,这就是它抛出的原因。如果是这种情况,请尝试使用:npmjs.com/package/mkdirp
  • @Charminbear 两个目录(父目录和子目录)实际上已经存在。所以第一个问题是 fs.existsSync 似乎失败了,然后创建一个已经存在的目录失败了。
  • ./realworks/objects/ 是相对于节点可执行文件而不是你的脚本,只是说。

标签: node.js


【解决方案1】:

所以...您可能正在使用 ubuntu 终端来创建您的 react 应用程序。

碰巧我正在测试windows最近启动的ubuntu终端安装在windows电脑上,就像虚拟机一样,但实际上并没有那么凌乱。

我碰巧遇到了和你们一样的错误,在测试了社区之前提供的所有选项之后,它们都不起作用。但是,我确实找到了解决我的问题的方法。它给了我 ENOENT 错误,例如找不到测试文件或目录。但我确实在那里。我正在使用 npm start,并想出了使用 sudo npm start... 的想法,并且成功了。

【讨论】:

  • 与操作系统无关
【解决方案2】:

什么对我有用;

  1. 删除我的 yarn.lock、package-lock.json 和 nodemodules
  2. yarn build重新安装
  3. 重新启动我的本地服务器

【讨论】:

    【解决方案3】:

    ENOENT 在linux documentation 中描述如下:

    没有这样的文件或目录 (POSIX.1-2001)。

    通常,当指定路径时会出现此错误- 名称不存在,或其中的组件之一 路径名的目录前缀不存在,或者 指定的路径名​​是一个悬空符号链接。

    ENOENT 的另一个可能原因是您没有足够的权限来创建目录。

    这发生在我构建 docker 映像时,我没有足够的权限在当前 WORKDIR 中创建子文件夹。使用 --chown=user:usergroup 更改文件夹的所有者或将指令的 USER 更改为 root 用户都是该问题的有效解决方案。

    【讨论】:

      【解决方案4】:

      在这里解决How to create full path with node's fs.mkdirSync?

      NodeJS 版本 10.12.0 添加了对 mkdir 和 mkdirSync 的原生支持,以使用 recursive: true 选项递归创建目录,如下所示:

      fs.mkdirSync(targetDir, { recursive: true });
      

      如果你更喜欢 fs Promises API,你可以写

      fs.promises.mkdir(targetDir, { recursive: true });
      

      【讨论】:

      • b/c 这个答案专门针对mkdirSync,就像 OP +1 一样
      【解决方案5】:

      当您使用fs.mkdirfs.mkdirSync时,同时传递folder1/folder2/folder3folder1folder2等路径必须存在,否则会出现上述错误。

      【讨论】:

        【解决方案6】:

        当指定路径上的任何文件夹丢失时,mkdir 将抛出 ENOENT

        有 2 种可能的解决方案(不使用 3rd 方包):

        • 为路径上每个不存在的目录递归调用fs.mkdir
        • 使用 v10.12 中引入的recursive 选项:
          fs.mkdir('./path/to/dir', {recursive: true}, err =&gt; {})

        【讨论】:

        • 我如何知道“v10.12 中引入了递归选项”?有官方文件吗?
        • @ZilMike 是的,官方文档对每个功能都有一个历史部分(您需要通过单击它来展开它)参见nodejs.org/api/fs.html#fs_fs_mkdir_path_options_callback
        • 奇怪的是,在 10.19.0 中,即使有标志,它也无法正常工作。
        【解决方案7】:

        错误的原因是,如果任何文件夹存在于 fs.mkdir 或 fs.mkdirSync 的路径中,这些方法将抛出/回调 ENOENT 错误。

        【讨论】:

          【解决方案8】:

          以下内容对我有用:

          fs.mkdir( __dirname + '/realworks/', err => {})
          

          【讨论】:

            【解决方案9】:

            试试:

            fs.mkdir('./realworks/', err => {})
            

            【讨论】:

            • 这应该是一个评论,直到被证明是修复。
            【解决方案10】:

            问题是由forever 相对于调用forever start 命令的工作目录而不是应用程序入口点的位置运行应用程序引起的。

            【讨论】:

            • 那么解决办法是什么??您只是从您的角度告诉我们原因。你应该给出一个你可以接受的解决方案
            猜你喜欢
            • 1970-01-01
            • 2018-07-03
            • 2014-01-12
            • 1970-01-01
            • 2023-03-31
            • 2013-07-28
            • 2019-02-03
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多