如何解决NodeJS Error: ENOSPC

背景

下午收到运维同学的通知,告知测试环境的服务器拉取新代码发版后,启动不了服务。错误日志上,显示错误码 ENOSPC

异常报错

经过一番谷歌后,定位到 ENOSPC 上。
ENOSPC的含义是 Error No more hard-disk space available(没有更多的磁盘空间可以使用)。最初,怀疑是 /tmp目录下的文件,耗尽空间。但是,我们的NodeJS服务是通过docker启动的。项目没成功启动,无法进入docker 内删除 /tmp目录。(很好奇,为什么启动项目会产生这么多临时文件)。

后来看到一段解释

What this command does is to increase the number of watches allowed for a single user. By the default the number can be low (8192 for example). When nodemon tries to watch large numbers of directories for changes it has to create several watches, which can surpass that limit.

错误原因是,nodemon监听文件过多(超过系统允许监听的默认值)导致出现异常。系统默认允许监听文件数为一个较低数值,例如8192。可以通过增加系统允许监听文件数,避免这个报错。结合了项目的启动方式,发现启动时,使用了nodemon进行文件监听。更加肯定错误原因与监听文件过多有关。而且,我们没有给 nodemon 配置过滤规则。因此,会导致监听文件超过默认值。

解决办法

方法一:提高系统允许监听文件数

echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf && sudo sysctl -p

方法二:过滤掉不必要的监听的文件

在项目的根目录,创建 nodemon.json 文件,并设置过滤内容。

// nodemon.json

{
  "ignore": [
    "*.test.js", 
    "dist/*"
  ]
}

需要注意的是,nodemon 会默认忽略掉以下类型的文件, .git, node_modules, bower_components, .nyc_output, coverage.sass-cache。因此,不必将这些类型的文件放入到配置中。

参考资料

推荐阅读更多精彩内容

  • https://nodejs.org/api/documentation.html 工具模块 Assert 测试 ...
    KeKeMars阅读 3,974评论 0 6
  • 33、JS中的本地存储 把一些信息存储在当前浏览器指定域下的某一个地方(存储到物理硬盘中)1、不能跨浏览器传输:在...
    萌妹撒阅读 514评论 0 1
  • 概要 64学时 3.5学分 章节安排 电子商务网站概况 HTML5+CSS3 JavaScript Node 电子...
    阿啊阿吖丁阅读 2,077评论 2 2
  • Node基本 node的最大特性莫过于基于事件驱动的非阻塞I/O模型。 node通过事件驱动的方式处理请求,无须为...
    AkaTBS阅读 1,178评论 0 11
  • 面试题一:https://github.com/jimuyouyou/node-interview-questio...
    R_X阅读 753评论 0 4