用fs读取文件后parsingJson

我试图build立两个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'); } }); 

第一次文件被改变一切都OK! 但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) 

我认为这是一个asynchronous读/写文件的问题,但没有设法find一个解决scheme…是否每个人都能够帮助我或有线索? 谢谢

不鼓励用户asynchronous访问文件系统,因为在访问时,目标文件可以通过应用程序生命周期中的某些内容进行修改。

我build议你使用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)) ; }); 

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

 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) { ...潜在问题fs.writeFile(outputDeparts, data, function(err) { ...callback函数必须提供有序的写入,但是您的代码只logging错误。

Node.js文档

请注意,在不等待callback的情况下,多次在同一个文件上使用fs.writeFile是不安全的。 对于这种情况,强烈build议使用fs.createWriteStream