等待创建文件以在node.js中读取它

时间:2019-09-29 16:45:10

标签: node.js fs

我正在尝试使用文件创建和删除作为python和nodejs之间的数据传输方法(我知道这不是最好的方法)。该程序的python端工作正常,因为我对python 3相当熟悉,但是我无法使node.js脚本正常工作。

我尝试了各种检测文件创建时间的方法,主要是使用try {} catch {},但没有一个起作用。

function fufillRequest(data) {
  fs.writeFile('Response.txt', data)
}

while(true) {
  try {
    fs.readFile('Request.txt', function(err,data) {
      console.log(data);
    });
  } catch {

  }
}

该程序应该看到文件已创建,读取文件的内容,将其删除然后创建并写入响应文件。

2 个答案:

答案 0 :(得分:0)

您可以使用循环计时器,也可以使用fs.watch()来监视文件出现的时间。

这是一个重复计时器的样子:

const checkTime = 1000;
const fs = require('fs`);

function check() {
   setTimeout(() => {
       fs.readFile('Request.txt', 'utf8', function(err, data) {
          if (err) {
              // got error reading the file, call check() again
              check();
          } else {
              // we have the file contents here, so do something with it
              // can delete the source file too
          }
       });
   }, checkTime)
}

check();

注意:无论创建该文件的任何进程,在写入时都应该使用独占访问模式,这样您就不会在其他进程完成写入之前就创建一个开始读取文件的竞争条件。

答案 1 :(得分:0)

@ jfriend00解决方案是正确的。但是,在上述解决方案中。它永远不会清除超时。可能会引起问题。如果您需要阻塞代码和更好的计时器处理能力,则可以使用setInterval。

示例:

const checkTime = 1000;
var fs = require("fs");
const messageFile = "test.js";
const timerId = setInterval(() => {
  const isExists = fs.existsSync(messageFile, 'utf8')
  if(isExists) {
    // do something here
    clearInterval(timerId)
  }
}, checkTime)

您还可以运行python程序。无需编写其他脚本。

const spawn = require("child_process").spawn;
const proc = spawn('python',["./watch.py"]);

proc.stdout.on('data', (data) => console.log(data.toString()))
proc.stderr.on('data', (data) => console.log(data.toString()))