【发布时间】:2021-08-10 19:56:34
【问题描述】:
在我的代码运行大约一个小时后,我会随机收到此错误。
SyntaxError: Unexpected end of JSON input
at JSON.parse (<anonymous>)
这是我的代码:
function matchMaking() {
setInterval(function() {
fs.readFile('./rankedQueue.json', 'utf8', function(err, data) {
const file = JSON.parse(data); //The line the error occurs
if (err) {
console.log(err)
} else {
//lots of code here
}
})
}, 10 * 1000)
}
编辑:这是 JSON 文件的内容。
{
"queue": [],
"waiting": [],
"lowLevel": [],
"placeHolder": [
{
"test": "test"
}
]
}
数组被推送到,然后每分钟拼接几次。
在这里和一些论坛搜索后,我尝试使用 fs.readFileSync,这使得代码根本无法运行。现在我发现了一些关于这个错误的具体例子,我似乎无法让解决方案适用于我。如果有人知道我应该改变什么,将不胜感激。
提前致谢。
【问题讨论】:
-
听起来好像您正在读取文件,而该文件被另一个应用程序写入了一半。如果您无法控制其他应用程序,那么我只需捕获“json 输入意外结束”错误,等待几秒钟并重试,可能多次。如果您确实可以控制它,那么我会对其进行更改,以便将其写入另一个临时文件,然后仅在完成后删除旧文件并重命名临时文件。在删除和重命名之间仍然需要考虑竞争条件,但窗口可能会更短。但最好使用某种 IPC 而不是文件。
-
(我不认为您发布的 json 文件在失败时真的是文件中的内容,也许在您的
catch中执行fs.writeFile('badfile.txt', data),然后在再次失败后检查badfile.txt看看程序到底“看到”了什么无效的 JSON。)
标签: node.js json discord.js setinterval