DiscordJS + NodeJS:SyntaxError:JSON.parse 处的 JSON 输入意外结束(<anonymous>)
Posted
技术标签:
【中文标题】DiscordJS + NodeJS:SyntaxError:JSON.parse 处的 JSON 输入意外结束(<anonymous>)【英文标题】:DiscordJS + NodeJS: SyntaxError: Unexpected end of JSON input at JSON.parse (<anonymous>) 【发布时间】: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。)
【参考方案1】:
如何使用 fs.readFileSync
使用fs.readFileSync
返回buffer
。您可以轻松地将缓冲区转换为可读的内容。你使用buffer.toString('ascii')
。此外,fs.readFile
有一个回调参数,而 readFileSync 没有。我认为你对readFileSync
所做的是:
fs.readFileSync('./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
)
但实际上你应该这样做:
var data = fs.readFileSync('./rankedQueue.json');
var JSON = JSON.parse(data.toString('ascii'));
你可以放弃'ascii'
。
不正确/笨拙的答案
请改用require
。 Node.JS 拥有它,因此它可以为您解析 JSON
文件。请记住,与 fs
相比,您需要文件的方式是不同的。
如果您的代码位于/project/foobar/code.js
JSON 位于/project/rankedQueue.json
fs
自动转到项目文件夹的顶部,例如/project
& 所以./rankedQueue.json
require
不这样做,并保留在文件所在的文件夹中。你必须为你想去上面的每个文件夹添加../
。所以:./../rankedQueue.json
。
我建议您也通过验证器运行您的JSON
,以便它可以告诉您出了什么问题。
【讨论】:
但是 require 会缓存结果,因此对于用户不断变化的文件不起作用。另外,require 是同步的并且会阻塞执行,所以这不是一个好的解决方案。 +CherryDT 解决缓存问题,就是delete require.cache[require.resolve('directory')]
是的,但是你为什么要制造一个问题然后用hackishly修复它? OP 已经在使用正确的方法来读取数据文件(不属于存储库的一部分):fs.readFile
和 JSON.parse
。
+CherryDT,我刚刚想出了另一种方法,所以我现在就更新我的帖子。【参考方案2】:
正如错误所说,数据不是 json 类型
你能确定文件是有效的,它是JSON.parse()
可以解析的吗
【讨论】:
对不起。该帖子已被编辑以包含 JSON 文件的内容。 如果是json文件我觉得可以直接导入不需要JSON.parse();
否,因为那会缓存结果并且是同步的。以上是关于DiscordJS + NodeJS:SyntaxError:JSON.parse 处的 JSON 输入意外结束(<anonymous>)的主要内容,如果未能解决你的问题,请参考以下文章
如何从 NodeJS 中的用户名中获取 Minecraft 玩家的 UUID?