Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Node.js文件系统每2秒保存文件时发生56 EROFS错误_Javascript_Node.js_Raspberry Pi_Raspbian_Raspberry Pi3 - Fatal编程技术网

Javascript Node.js文件系统每2秒保存文件时发生56 EROFS错误

Javascript Node.js文件系统每2秒保存文件时发生56 EROFS错误,javascript,node.js,raspberry-pi,raspbian,raspberry-pi3,Javascript,Node.js,Raspberry Pi,Raspbian,Raspberry Pi3,我正在raspbian上运行node.js,并尝试使用以下代码每2/3秒保存/更新一个文件: var saveFileSaving = false; function loop() { mainLoop = setTimeout(function() { // update data saveSaveFile(data, function() { //console.log("Saved data to file");

我正在raspbian上运行node.js,并尝试使用以下代码每2/3秒保存/更新一个文件:

var saveFileSaving = false;

function loop() {
    mainLoop = setTimeout(function() {
        // update data

        saveSaveFile(data, function() {
            //console.log("Saved data to file");
            loop();
        });
    }, 1500);
}

function saveSaveFile(data, callback) {
    if(!saveFileSaving) {
        saveFileSaving = true;
        var wstream = fs.createWriteStream(path.join(__dirname, 'save.json'));

        wstream.on('finish', function () {
            saveFileSaving = false;
            callback(data);
        });

        wstream.on('error', function (error) {
            console.log(error);
            saveFileSaving = false;
            wstream.end();
            callback(null);
        });

        wstream.write(JSON.stringify(data));
        wstream.end();
    } else {
        callback(null);
    }
}
当我运行它时,它可以正常工作一个小时,然后开始吐出:

[25/May/2016 11:3:4 am]  { [Error: EROFS, open '<path to file>']
  errno: 56,
  code: 'EROFS',
  path: '<path to file>' }
[25/May/2016 11:3:4 am]{[错误:EROFS,打开“”]
呃:56,,
代码:“EROFS”,
路径:'}
我尝试过jsonfile插件,它在一小时后也会发出类似的写入错误

我尝试了fileSystem.writeFile和fileSystem.writeFileSync,两个文件都在一小时后出现了相同的错误

我认为这与处理程序在新的保存发生之前没有被释放有关,这就是为什么我开始使用saveFileSaving标志

通过硬复位重置系统解决了问题(软复位不起作用,因为系统似乎被锁定)

有什么建议吗?我在网上搜索过,所以只发现了一个与4年前稍有相似的问题,这个问题仍然悬而未决

注意:我使用代码中的回调函数继续主循环。

以下是我的想法:

1) 当出现此问题时,通过键入terminal:

df -h
2) 当问题发生时,还要检查文件是否可编辑。使用nano或vim等

3) 您的代码太复杂,无法简单地安排数据操作并将其写入文件。因为即使是您的文件也会很忙(SaveFileSaveing),所以在下一次迭代之前您将丢失数据,请尝试使用该代码:

var 
  async = require('async'),
  fs = require('fs'),
  path = require('path');

async.forever(function(next) {
  // some data manipulation

  try {
    fs.writeFileSync(path.join(__dirname, 'save.json'), JSON.stringify(data));
  }
  catch(ex) {
    console.error('Error writing data to file:', ex);
  }

  setTimeout(next, 2000);
});
4) 让文件描述符保持打开状态如何

var 
  async = require('async'),
  fs = require('fs'),
  path = require('path');

var file = fs.createWriteStream(path.join(__dirname, 'save.json'));

async.forever(function(next) {
  // some data manipulation

  file.write(JSON.stringify(data));
  setTimeout(next, 2000);
});

var handleSignal = function (exc) {
  // close file
  file.end();

  if(exc) {
    console.log('STOPPING PROCESS BECAUSE OF:', exc);
  }
  process.exit(-1);
}

process.on('uncaughtException', handleSignal);
process.on('SIGHUP', handleSignal);

5) raspberry的存储控制器出现硬件或软件问题(可能是因为操作系统驱动程序)。

我可以通过取消文件链接并在每次保存时保存文件来实现这一点,虽然它不太好,但它可以正常工作,并且不会造成太多开销

我还添加了一个备份解决方案,它每5分钟保存一次备份,以防保存文件出现问题


感谢大家的帮助。

只读文件系统?我相信在保存过程中会发生一些事情,会弄乱已装入的驱动器,并以某种方式将已装入的驱动器更改为只读。因为硬重置可以解决问题,所以哪种方法是有意义的。但在文件保存过程中,是什么导致了这种变化呢?挂载中有一个标记,叫做“错误时重新挂载ro”,如果有,可能是check fstab?或者在没有任何参数的情况下运行mount命令来获取列表。下次出现时,我将检查空间,但文件为3kb,并且始终在10kbHey mate下。在运行应用程序并遇到相同的问题后,我尝试运行建议的命令,但我无法执行。终端只是挂起,什么也不做。唯一有效的命令是cd。我对你的想法很感兴趣,但这会不会不经常将数据附加到文件中?我希望每次编写时都替换文件。关于替换:来自(3)的示例。关于问题:2个原因:a。硬件问题,b。没有可用空间,可能是因为交换,或者可能是日志文件…下一步我将尝试(3),可用空间不应该是一个问题,因为我只使用了32gb的15%。还有什么方法可以确认硬件问题吗?尝试将文件写入其他位置、外部HDD或连接dropbox