使用 fs 读取文件后解析 Json

Parsing Json after reading file with fs

我正在尝试在两个 node.js 脚本之间建立通信。 第一个执行获取请求并将响应写入文件。 第二个看修改后的文件,然后他读取,并提示结果。

第一个(搞定再写)

var request = require('request');
var parseString = require('xml2js').parseString;
var fs = require('fs');

//Some needed variables

streamInterval = setInterval(function() {
      request.get(addr, function (error, response, body) {
      if (!error && response.statusCode == 200) {
        parseString(body,{ explicitArray : false, ignoreAttrs : true }, function (err, result) {
            var jsonResult = JSON.stringify(result);
            var result = JSON.parse(jsonResult);

            fs.writeFile(outputDeparts, JSON.stringify(result, null, 4), function(err) {
                if(err) {
                  console.log(err);
                }
            }); 

        });
      }else{
        console.log("An error occured : " + response.statusCode);
      }
    }).auth(LOGIN,PASS,true);
  }, 30000);

第二个(修改后观看,阅读并提示)

var fs = require('fs');

//Some needed variables


fs.watch(outputDeparts, (eventType, filename) => {
  console.log(`event type is: ${eventType}`);
  if (filename) {
    console.log(`filename provided: ${filename}`);
    fs.readFile(outputDeparts, 'utf8', function (err, data) {
      if (err){
        throw err;
      }else{
        console.log('start parsing');
        console.log(data);
        var result = JSON.parse(data);
        var departs = result["passages"]["train"];
        console.log(`next train [${departs[0]["num"]}] at : ${departs[0]["date"]}`);
      }
    });
  } else {
    console.log('filename not provided');
  }
});

第一次改文件一切正常!但是 30 秒后,在第二次更改时,我收到以下错误:

undefined:1

SyntaxError: Unexpected end of input
    at Object.parse (native)
    at /Users/adobe/Documents/workspace/playWithNode/watchFile.js:17:23
    at tryToString (fs.js:414:3)
    at FSReqWrap.readFileAfterClose [as oncomplete] (fs.js:401:12)

我认为 reading/writting 文件异步存在问题,但未能找到解决方法... 每个人都可以帮助我或有线索吗?谢谢

尝试将第二个文件中的代码更改为

var result; 
try {
    result = JSON.parse(data);
} catch (err) {
    console.error(err, data);
}

因为 SyntaxError: Unexpected end of input 这是 JSON.parse 错误。

在第一个文件中,我看到了潜在的问题 fs.writeFile(outputDeparts, data, function(err) { ... 回调函数必须提供有序写入,但您的代码 - 仅记录错误。

Node.js 文档

Note that it is unsafe to use fs.writeFile multiple times on the same file without waiting for the callback. For this scenario, fs.createWriteStream is strongly recommended.

..不鼓励异步访问文件系统,因为在访问时,目标文件可能会被应用程序生命周期中的某些内容修改。

我建议你使用 fs.readFileSync 并将 JSON.parse 包装在 try-catch

var fs = require('fs');

function onNextTrain(data) { 
  console.log("onNextTrain", data);
  
  return data;
}

fs.watch(outputDeparts, (eventType, filename) => {
  return new Promise((resolve, reject) => {
    if(!filename) {
      return reject("FILE NAME NOT PROVIDED");
    }
    
    let 
      data = fs.readFileSync(filename, 'utf8'),
      result
    ;
    
    try {
      result = JSON.parse(data);
    } catch(error) {
      result = data;
    }
    
    return resolve(result);
  })
    .then(onNextTrain)
    .catch(err => console.log("error", err))
  ;
});