用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
。