写入特定(非完整)分区时,fs.writeFile失败且没有错误

时间:2018-03-22 11:07:32

标签: node.js express fs

我正在为在网上找到的favicons实现图像缓存。有一次我有了favicon的URL,我将它发送到我的页面,一切都很好。

现在,我将这个图标写入磁盘,使用我使用URL组件构建的伪唯一文件名。

这也有效,但只有当我写信给/tmp/时才

这是我的代码:

router.get('/favicon', function(req, res) {
  favicon(req.query.url, function(err, iconUrl) {
    if (iconUrl) {
      var u = Url.parse(iconUrl);
      request.get({url: iconUrl}, function (err, response, body) {
        if (!err && typeof body !== 'undefined') {
          var h = u.host.replace(/\//g, ''),
              p = u.path.replace(/\//g, ''),
              fileName;

          fileName = path.join('/tmp', h + '.' + p);
          // fileName = path.join(__dirname, '..', 'cache', h + '.' + p);

          fs.writeFile(fileName, body, function(err) {
            if(err)
              console.log(err);
            else
              console.log("SAVED! (%s)", fileName);
          });
        } else {
          console.log('### ERROR iconUrl: (%s) err: (%s)', iconUrl, err);
        }
      });
      res.send(iconUrl);
    } else {
      res.status(500).send('No icon found');
    }
  });
});

这在客户端(Web浏览器)端调用,如下所示:

$.get("/favicon", {
  url: decodeURI(feedHost),
  dataType: "json",
  timeout: 2000
}, function(iconURL) {
  console.info('OK (icon: %s)', iconURL);
}).done(function(iconURL) {
  console.info('OK (icon: %s)', iconURL);
}).fail(function() {
  console.error('ERROR');
});

我虽然这是一个“磁盘已满”的问题,但不是,这是该机器上的分区表,/home分区内的项目目录(我的图像缓存目录所在的位置),{{1嗯,好吧,在/tmp/上:

/

因此,当我使用上面的代码时,一切正常,# df -h Filesystem Size Used Avail Use% Mounted on udev 1.9G 0 1.9G 0% /dev tmpfs 388M 6.3M 382M 2% /run /dev/sda6 19G 14G 3.8G 79% / tmpfs 1.9G 23M 1.9G 2% /dev/shm tmpfs 5.0M 4.0K 5.0M 1% /run/lock tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup /dev/loop0 82M 82M 0 100% /snap/core/4206 /dev/loop1 128M 128M 0 100% /snap/shotcut/20 /dev/loop2 82M 82M 0 100% /snap/core/4110 /dev/loop3 82M 82M 0 100% /snap/core/4017 /dev/loop4 298M 298M 0 100% /snap/shotcut/17 /dev/loop5 128M 128M 0 100% /snap/shotcut/21 /dev/sda5 121G 102G 14G 89% /home tmpfs 388M 12K 388M 1% /run/user/1000 填充图像,异步,完美。

当我删除文件路径的前导/tmp/时 - 当然指向有效路径 - 然后复制一个,两个,最多3个favicons,然后该过程以某种方式失败,触发{{ 1}}方法一是客户端,但在服务器上没有任何错误

帮助!

问题:

  • 什么可能导致这个奇怪的“写2或3文件然后停止”问题?注意:服务器使用PM2启动。
  • 我的ajax调用(JQuery /)是否正确?为什么它会使页面中的其他ajax调用失败,而不是轻轻地错误然后继续?

更新

事实证明我没有在.fail()中保存正确的图像文件;我现在正在使用此代码:

$.get()

现在保存的文件是正确的图像文件;然而问题仍然存在,我现在已经在其他几台(Linux)机器上测试了这个代码,包括生产Web服务器,同样的事情!无法在项目仓库中保存(超过少数几个)文件,但如果我使用/tmp/作为文件路径,一切都很好!

这让我发疯,请让我摆脱这种痛苦:|

更新2

我设法写入我的家庭分区。我无法写的唯一地方是项目目录(包括)项目目录中的任何目录

1 个答案:

答案 0 :(得分:0)

好的,我发现了。罪魁祸首是the pm2 watcher,当在项目的整个范围内写入内容时重启服务器。

这是(很难找到,如果它写在某处,我不知道在哪里)的原因我可以在磁盘上的任何地方编写我的图像文件在项目目录中没有任何错误,只是缓慢而混乱的服务器崩溃;感谢您的耐心等待。

所以我创建了以下pm2流程管理文件(通过this answer运行pm2 ecosystem simple

{
  "apps" : [{
    "name"            : "petrolette",
    "script"          : "./bin/www",
    "watch"           : true,
    "ignore_watch"    : ["favicons-cache"],
    "log_date_format" : "YYYY-MM-DD HH:mm",
    "env": {
      "PORT": 8666,
      "FAVICONS_CACHE_DIR": "favicons-cache"
    },
    "env_production" : {
      "NODE_ENV": "production"
    }
  }]
}

所以现在我的favicons-cache目录不受监视进程的影响,作为奖励,它的名称现在是ENV var,因此我可以使用process.env.FAVICONS_CACHE_DIR访问它:)