使用 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))
;
});
我正在尝试在两个 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))
;
});