使用fs.watch()和require()NodeJS时JSON输入意外结束
在我的使用fs.watch()和require()NodeJS时JSON输入意外结束,json,node.js,parsing,require,fs,Json,Node.js,Parsing,Require,Fs,在我的/Assetto1/results文件夹(.json文件)中检查新文件时,代码应读取新文件(result=require(“[…]”)并将其登录到控制台。但我总是犯同样的错误。甚至试了8个小时。当使用fs.readFile()而不是require()时,也会发生同样的情况。我甚至尝试了一个名为“decache”的npm模块,这样我就可以以某种方式“取消”对文件的要求。我的想法是nodejs期望JSON文件的结尾。但这些都没有帮助 看看我写的代码: var fs = require("fs"
/Assetto1/results
文件夹(.json文件)中检查新文件时,代码应读取新文件(result=require(“[…]”)并将其登录到控制台。但我总是犯同样的错误。甚至试了8个小时。当使用fs.readFile()
而不是require()
时,也会发生同样的情况。我甚至尝试了一个名为“decache”的npm模块,这样我就可以以某种方式“取消”对文件的要求。我的想法是nodejs期望JSON文件的结尾。但这些都没有帮助
看看我写的代码:
var fs = require("fs");
fs.watch('./Assetto1/results/', (eventType, filename) => {
console.log("EventType:"+eventType);
if (eventType == "rename") {
console.log("Debug: Rename");
console.log("./Assetto1/results/"+filename);
result = require("./Assetto1/results/"+filename);
console.log(result);
}
})
控制台输出如下所示:
SyntaxError: /home/Assetto1/results/2018_9_8_9_0_RACE.json: Unexpected end of JSON input
at JSON.parse (<anonymous>)
at Object.Module._extensions..json (internal/modules/cjs/loader.js:708:27)
at Module.load (internal/modules/cjs/loader.js:599:32)
at tryModuleLoad (internal/modules/cjs/loader.js:538:12)
at Function.Module._load (internal/modules/cjs/loader.js:530:3)
at Module.require (internal/modules/cjs/loader.js:637:17)
at require (internal/modules/cjs/helpers.js:20:18)
at FSWatcher.fs.watch (/home/main.js:59:12)
at FSWatcher.emit (events.js:182:13)
at FSEvent.FSWatcher._handle.onchange (internal/fs/watchers.js:130:12)
所以现在我真的不知道我能做些什么来对付它。
也许你们能帮我,
谢谢。文件是如何创建的?您可能只是在创建文件时遇到了一个争用条件(这会触发fs.watch
事件并读取文件),然后经过一点处理后写入JSON,但已经太晚了。或者JSON很大,需要时间来编写
您有两个选择:
- 创建JSON的进程应该在另一个目录中工作(但在同一个文件系统上)。文件完全写入后,将其移动到目录中。这样,您就有了一个原子更改,并且您知道当您收到事件时,文件就完成了
另一种方法是在同一目录中写入,但完成后重命名,并对哪些文件是临时文件或最终文件有约定(例如,如果文件是.xxxx.tmp,则忽略该事件)
- 或者当您收到文件事件时(
重命名
或更改
):
- 取消以前为该文件创建的任何计时器
- 为该文件创建一个新计时器
- 当计时器过期时,实际读取文件
所以伙计们,在仔细阅读了你们的帖子之后,我有了一个想法,那就是我只需要等到文件完全写完。我用一个简单的Atomics.wait(新的Int32Array(新的SharedArrayBuffer(4)),0,0,1000)实现了这一点代码>之后,我可以毫无问题地读取文件。所以,对于像我这样偶然发现这个问题的人来说,这就是解决方案。
谢谢所以请确定:它实际上是一个有效的JSON文件,首先?是的,当然是。我检查了一下,它说它是有效的。如果你做了一个readFile
并记录了文件的内容会怎么样?你能发布json文件的内容吗?@robertklep,是的,我被那一个愚弄了一分钟,但我检查了文档,其中说明在大多数平台上,每当文件名在目录中出现或消失时,都会发出“重命名”命令。这两个选项仍然是“改进机会”修复程序。它们既不是真正的原子,也没有消除竞争条件。(更改事件仍然可以在系统I/O峰值之前生成,该峰值会无限期地延迟写入。)也就是说,它们都可能在开发过程中消除问题。
{
"TrackName": "spa",
"TrackConfig": "",
"Type": "RACE",
"DurationSecs": 0,
"RaceLaps": 5,
"Cars": [
{
"CarId": 0,
"Driver": {
"Name": "NoaH",
"Team": "",
"Nation": "DEU",
"Guid": "76561198190801825",
"GuidsList": [
""
]
},
"Model": "mercedes_sls_gt3",
"Skin": "Black_Falcon_SB_Mobel_Boss_10",
"BallastKG": 0,
"Restrictor": 0
},
{
"CarId": 1,
"Driver": {
"Name": "",
"Team": "",
"Nation": "",
"Guid": "",
"GuidsList": [
""
]
},
"Model": "mercedes_sls_gt3",
"Skin": "Black_Falcon_Porta_9",
"BallastKG": 0,
"Restrictor": 0
},
{
"CarId": 2,
"Driver": {
"Name": "",
"Team": "",
"Nation": "",
"Guid": "",
"GuidsList": [
""
]
},
"Model": "mercedes_sls_gt3",
"Skin": "Kunos_zp_115",
"BallastKG": 0,
"Restrictor": 0
},
{
"CarId": 3,
"Driver": {
"Name": "",
"Team": "",
"Nation": "",
"Guid": "",
"GuidsList": [
""
]
},
"Model": "mercedes_sls_gt3",
"Skin": "Kunos_zp_116",
"BallastKG": 0,
"Restrictor": 0
},
{
"CarId": 4,
"Driver": {
"Name": "",
"Team": "",
"Nation": "",
"Guid": "",
"GuidsList": [
""
]
},
"Model": "mercedes_sls_gt3",
"Skin": "Black_Falcon_Dubai_24H_2",
"BallastKG": 0,
"Restrictor": 0
},
{
"CarId": 5,
"Driver": {
"Name": "",
"Team": "",
"Nation": "",
"Guid": "",
"GuidsList": [
""
]
},
"Model": "mercedes_sls_gt3",
"Skin": "Black_Falcon_SB_Mobel_Boss_10",
"BallastKG": 0,
"Restrictor": 0
},
{
"CarId": 6,
"Driver": {
"Name": "",
"Team": "",
"Nation": "",
"Guid": "",
"GuidsList": [
""
]
},
"Model": "mercedes_sls_gt3",
"Skin": "Black_Falcon_Porta_9",
"BallastKG": 0,
"Restrictor": 0
},
{
"CarId": 7,
"Driver": {
"Name": "",
"Team": "",
"Nation": "",
"Guid": "",
"GuidsList": [
""
]
},
"Model": "mercedes_sls_gt3",
"Skin": "Kunos_zp_115",
"BallastKG": 0,
"Restrictor": 0
},
{
"CarId": 8,
"Driver": {
"Name": "",
"Team": "",
"Nation": "",
"Guid": "",
"GuidsList": [
""
]
},
"Model": "mercedes_sls_gt3",
"Skin": "Kunos_zp_116",
"BallastKG": 0,
"Restrictor": 0
},
{
"CarId": 9,
"Driver": {
"Name": "",
"Team": "",
"Nation": "",
"Guid": "",
"GuidsList": [
""
]
},
"Model": "mercedes_sls_gt3",
"Skin": "Black_Falcon_Dubai_24H_2",
"BallastKG": 0,
"Restrictor": 0
},
{
"CarId": 10,
"Driver": {
"Name": "Ian Loncar",
"Team": "",
"Nation": "HRV",
"Guid": "76561198273369988",
"GuidsList": [
""
]
},
"Model": "ks_nissan_gtr",
"Skin": "solid_red",
"BallastKG": 0,
"Restrictor": 0
},
{
"CarId": 11,
"Driver": {
"Name": "",
"Team": "",
"Nation": "",
"Guid": "",
"GuidsList": [
""
]
},
"Model": "ks_nissan_gtr",
"Skin": "jet_black",
"BallastKG": 0,
"Restrictor": 0
},
{
"CarId": 12,
"Driver": {
"Name": "",
"Team": "",
"Nation": "",
"Guid": "",
"GuidsList": [
""
]
},
"Model": "ks_nissan_gtr",
"Skin": "0_pearl_white",
"BallastKG": 0,
"Restrictor": 0
},
{
"CarId": 13,
"Driver": {
"Name": "",
"Team": "",
"Nation": "",
"Guid": "",
"GuidsList": [
""
]
},
"Model": "ks_nissan_gtr",
"Skin": "super_silver",
"BallastKG": 0,
"Restrictor": 0
},
{
"CarId": 14,
"Driver": {
"Name": "",
"Team": "",
"Nation": "",
"Guid": "",
"GuidsList": [
""
]
},
"Model": "ks_nissan_gtr",
"Skin": "jet_black",
"BallastKG": 0,
"Restrictor": 0
},
{
"CarId": 15,
"Driver": {
"Name": "F. Riestra.ESP.",
"Team": "",
"Nation": "",
"Guid": "76561198130349639",
"GuidsList": [
""
]
},
"Model": "ks_audi_r8_plus",
"Skin": "10_sepang_blue_pearl",
"BallastKG": 0,
"Restrictor": 0
},
{
"CarId": 16,
"Driver": {
"Name": "",
"Team": "",
"Nation": "",
"Guid": "",
"GuidsList": [
""
]
},
"Model": "ks_audi_r8_plus",
"Skin": "11_suzuka_gray_metallic_t",
"BallastKG": 0,
"Restrictor": 0
},
{
"CarId": 17,
"Driver": {
"Name": "",
"Team": "",
"Nation": "",
"Guid": "",
"GuidsList": [
""
]
},
"Model": "ks_audi_r8_plus",
"Skin": "09_samoa_orange_metallic_t",
"BallastKG": 0,
"Restrictor": 0
},
{
"CarId": 18,
"Driver": {
"Name": "",
"Team": "",
"Nation": "",
"Guid": "",
"GuidsList": [
""
]
},
"Model": "ks_audi_r8_plus",
"Skin": "Brilliant_Red",
"BallastKG": 0,
"Restrictor": 0
},
{
"CarId": 19,
"Driver": {
"Name": "sale7almanna3i",
"Team": "",
"Nation": "QAT",
"Guid": "76561198139068257",
"GuidsList": [
""
]
},
"Model": "ks_lamborghini_huracan_performante",
"Skin": "blu_cepheus",
"BallastKG": 0,
"Restrictor": 0
},
{
"CarId": 20,
"Driver": {
"Name": "raafaal1661",
"Team": "",
"Nation": "",
"Guid": "76561198857669454",
"GuidsList": [
""
]
},
"Model": "ks_lamborghini_huracan_performante",
"Skin": "giallo_horus",
"BallastKG": 0,
"Restrictor": 0
},
{
"CarId": 21,
"Driver": {
"Name": "alexpavillanueva",
"Team": "",
"Nation": "ESP",
"Guid": "76561198834760853",
"GuidsList": [
""
]
},
"Model": "ks_lamborghini_huracan_performante",
"Skin": "blu_nethuns",
"BallastKG": 0,
"Restrictor": 0
},
{
"CarId": 22,
"Driver": {
"Name": "NoaH",
"Team": "",
"Nation": "DEU",
"Guid": "76561198190801825",
"GuidsList": [
""
]
},
"Model": "ks_lamborghini_huracan_performante",
"Skin": "00_arancio_anthaeus",
"BallastKG": 0,
"Restrictor": 0
},
{
"CarId": 23,
"Driver": {
"Name": "",
"Team": "",
"Nation": "",
"Guid": "",
"GuidsList": [
""
]
},
"Model": "ks_lamborghini_huracan_performante",
"Skin": "rosso_efesto",
"BallastKG": 0,
"Restrictor": 0
}
],
"Result": [
{
"DriverName": "NoaH",
"DriverGuid": "76561198190801825",
"CarId": 22,
"CarModel": "ks_lamborghini_huracan_performante",
"BestLap": 174182,
"TotalTime": 891017,
"BallastKG": 0,
"Restrictor": 0
},
{
"DriverName": "NoaH",
"DriverGuid": "76561198190801825",
"CarId": 0,
"CarModel": "mercedes_sls_gt3",
"BestLap": 999999999,
"TotalTime": 0,
"BallastKG": 0,
"Restrictor": 0
},
{
"DriverName": "",
"DriverGuid": "",
"CarId": 2,
"CarModel": "mercedes_sls_gt3",
"BestLap": 999999999,
"TotalTime": 0,
"BallastKG": 0,
"Restrictor": 0
},
{
"DriverName": "",
"DriverGuid": "",
"CarId": 3,
"CarModel": "mercedes_sls_gt3",
"BestLap": 999999999,
"TotalTime": 0,
"BallastKG": 0,
"Restrictor": 0
},
{
"DriverName": "",
"DriverGuid": "",
"CarId": 4,
"CarModel": "mercedes_sls_gt3",
"BestLap": 999999999,
"TotalTime": 0,
"BallastKG": 0,
"Restrictor": 0
},
{
"DriverName": "",
"DriverGuid": "",
"CarId": 5,
"CarModel": "mercedes_sls_gt3",
"BestLap": 999999999,
"TotalTime": 0,
"BallastKG": 0,
"Restrictor": 0
},
{
"DriverName": "",
"DriverGuid": "",
"CarId": 6,
"CarModel": "mercedes_sls_gt3",
"BestLap": 999999999,
"TotalTime": 0,
"BallastKG": 0,
"Restrictor": 0
},
{
"DriverName": "",
"DriverGuid": "",
"CarId": 7,
"CarModel": "mercedes_sls_gt3",
"BestLap": 999999999,
"TotalTime": 0,
"BallastKG": 0,
"Restrictor": 0
},
{
"DriverName": "",
"DriverGuid": "",
"CarId": 8,
"CarModel": "mercedes_sls_gt3",
"BestLap": 999999999,
"TotalTime": 0,
"BallastKG": 0,
"Restrictor": 0
},
{
"DriverName": "",
"DriverGuid": "",
"CarId": 9,
"CarModel": "mercedes_sls_gt3",
"BestLap": 999999999,
"TotalTime": 0,
"BallastKG": 0,
"Restrictor": 0
},
{
"DriverName": "Ian Loncar",
"DriverGuid": "76561198273369988",
"CarId": 10,
"CarModel": "ks_nissan_gtr",
"BestLap": 999999999,
"TotalTime": 0,
"BallastKG": 0,
"Restrictor": 0
},
{
"DriverName": "",
"DriverGuid": "",
"CarId": 11,
"CarModel": "ks_nissan_gtr",
"BestLap": 999999999,
"TotalTime": 0,
"BallastKG": 0,
"Restrictor": 0
},
{
"DriverName": "",
"DriverGuid": "",
"CarId": 12,
"CarModel": "ks_nissan_gtr",
"BestLap": 999999999,
"TotalTime": 0,
"BallastKG": 0,
"Restrictor": 0
},
{
"DriverName": "",
"DriverGuid": "",
"CarId": 13,
"CarModel": "ks_nissan_gtr",
"BestLap": 999999999,
"TotalTime": 0,
"BallastKG": 0,
"Restrictor": 0
},
{
"DriverName": "",
"DriverGuid": "",
"CarId": 14,
"CarModel": "ks_nissan_gtr",
"BestLap": 999999999,
"TotalTime": 0,
"BallastKG": 0,
"Restrictor": 0
},
{
"DriverName": "F. Riestra.ESP.",
"DriverGuid": "76561198130349639",
"CarId": 15,
"CarModel": "ks_audi_r8_plus",
"BestLap": 999999999,
"TotalTime": 0,
"BallastKG": 0,
"Restrictor": 0
},
{
"DriverName": "",
"DriverGuid": "",
"CarId": 16,
"CarModel": "ks_audi_r8_plus",
"BestLap": 999999999,
"TotalTime": 0,
"BallastKG": 0,
"Restrictor": 0
},
{
"DriverName": "",
"DriverGuid": "",
"CarId": 17,
"CarModel": "ks_audi_r8_plus",
"BestLap": 999999999,
"TotalTime": 0,
"BallastKG": 0,
"Restrictor": 0
},
{
"DriverName": "",
"DriverGuid": "",
"CarId": 18,
"CarModel": "ks_audi_r8_plus",
"BestLap": 999999999,
"TotalTime": 0,
"BallastKG": 0,
"Restrictor": 0
},
{
"DriverName": "sale7almanna3i",
"DriverGuid": "76561198139068257",
"CarId": 19,
"CarModel": "ks_lamborghini_huracan_performante",
"BestLap": 999999999,
"TotalTime": 0,
"BallastKG": 0,
"Restrictor": 0
},
{
"DriverName": "raafaal1661",
"DriverGuid": "76561198857669454",
"CarId": 20,
"CarModel": "ks_lamborghini_huracan_performante",
"BestLap": 999999999,
"TotalTime": 0,
"BallastKG": 0,
"Restrictor": 0
},
{
"DriverName": "alexpavillanueva",
"DriverGuid": "76561198834760853",
"CarId": 21,
"CarModel": "ks_lamborghini_huracan_performante",
"BestLap": 999999999,
"TotalTime": 0,
"BallastKG": 0,
"Restrictor": 0
},
{
"DriverName": "",
"DriverGuid": "",
"CarId": 1,
"CarModel": "mercedes_sls_gt3",
"BestLap": 999999999,
"TotalTime": 0,
"BallastKG": 0,
"Restrictor": 0
},
{
"DriverName": "",
"DriverGuid": "",
"CarId": 23,
"CarModel": "ks_lamborghini_huracan_performante",
"BestLap": 999999999,
"TotalTime": 0,
"BallastKG": 0,
"Restrictor": 0
}
],
"Laps": [
{
"DriverName": "NoaH",
"DriverGuid": "76561198190801825",
"CarId": 22,
"CarModel": "ks_lamborghini_huracan_performante",
"Timestamp": 35470691,
"LapTime": 180196,
"Sectors": [
50515,
82440,
47241
],
"Cuts": 0,
"BallastKG": 0,
"Tyre": "HR",
"Restrictor": 0
},
{
"DriverName": "NoaH",
"DriverGuid": "76561198190801825",
"CarId": 22,
"CarModel": "ks_lamborghini_huracan_performante",
"Timestamp": 35645934,
"LapTime": 175240,
"Sectors": [
48331,
82125,
44784
],
"Cuts": 0,
"BallastKG": 0,
"Tyre": "HR",
"Restrictor": 0
},
{
"DriverName": "NoaH",
"DriverGuid": "76561198190801825",
"CarId": 22,
"CarModel": "ks_lamborghini_huracan_performante",
"Timestamp": 35824671,
"LapTime": 178746,
"Sectors": [
46162,
85482,
47102
],
"Cuts": 0,
"BallastKG": 0,
"Tyre": "HR",
"Restrictor": 0
},
{
"DriverName": "NoaH",
"DriverGuid": "76561198190801825",
"CarId": 22,
"CarModel": "ks_lamborghini_huracan_performante",
"Timestamp": 36007357,
"LapTime": 182686,
"Sectors": [
46340,
85492,
50854
],
"Cuts": 0,
"BallastKG": 0,
"Tyre": "HR",
"Restrictor": 0
},
{
"DriverName": "NoaH",
"DriverGuid": "76561198190801825",
"CarId": 22,
"CarModel": "ks_lamborghini_huracan_performante",
"Timestamp": 36181518,
"LapTime": 174182,
"Sectors": [
46693,
81995,
45494
],
"Cuts": 0,
"BallastKG": 0,
"Tyre": "HR",
"Restrictor": 0
}
],
"Events": [
{
"Type": "COLLISION_WITH_ENV",
"CarId": 22,
"Driver": {
"Name": "NoaH",
"Team": "",
"Nation": "DEU",
"Guid": "76561198190801825",
"GuidsList": [
""
]
},
"OtherCarId": -1,
"OtherDriver": {
"Name": "",
"Team": "",
"Nation": "",
"Guid": "",
"GuidsList": null
},
"ImpactSpeed": 12.305487,
"WorldPosition": {
"X": 415.25763,
"Y": 38.005207,
"Z": 847.0971
},
"RelPosition": {
"X": -0.96855915,
"Y": 0.31426933,
"Z": -1.4876876
}
},
{
"Type": "COLLISION_WITH_ENV",
"CarId": 22,
"Driver": {
"Name": "NoaH",
"Team": "",
"Nation": "DEU",
"Guid": "76561198190801825",
"GuidsList": [
""
]
},
"OtherCarId": -1,
"OtherDriver": {
"Name": "",
"Team": "",
"Nation": "",
"Guid": "",
"GuidsList": null
},
"ImpactSpeed": 69.01873,
"WorldPosition": {
"X": -449.24142,
"Y": 30.581987,
"Z": -1006.0361
},
"RelPosition": {
"X": 0.68840855,
"Y": -0.285217,
"Z": 2.4184985
}
},
{
"Type": "COLLISION_WITH_ENV",
"CarId": 22,
"Driver": {
"Name": "NoaH",
"Team": "",
"Nation": "DEU",
"Guid": "76561198190801825",
"GuidsList": [
""
]
},
"OtherCarId": -1,
"OtherDriver": {
"Name": "",
"Team": "",
"Nation": "",
"Guid": "",
"GuidsList": null
},
"ImpactSpeed": 22.243214,
"WorldPosition": {
"X": 416.29285,
"Y": 37.574894,
"Z": 849.2622
},
"RelPosition": {
"X": -0.8986338,
"Y": -0.2784356,
"Z": 2.0484245
}
}
]
}