package.json 文件在一段时间后损坏

Posted

技术标签:

【中文标题】package.json 文件在一段时间后损坏【英文标题】:The package.json files are corrupted after a while 【发布时间】:2017-08-05 03:01:48 【问题描述】:

我使用装有 Windows 10 的公司计算机。 我有 nodejs v6.10.0 和 npm v3.10.10。 这是我第一次在这台电脑上安装nodejs/npm。

当我安装一个模块(任何类型的模块,例如npm install jsdoc)时,一切正常。我可以多次拨打我的example.js,一切正常。

但过了一段时间(随机时间)我无法再运行我的程序,因为我收到以下错误:

>node example.js
module.js:96
    throw e;
    ^

SyntaxError: Error parsing C:\my_path\node_modules\some_module\package.json: Unexpected token x in JSON at position 0

如果我用 SublimeText 检查package.json 的内容,我得到:

78c0 b658 72a3 e0f5 7832 e7d4 b5ee dcc8
8f00 9951 3b8a cbd5 db7f 4556 5e8b e88d
087d 9bb8 ff15 9acb 0a09 7aaf afd3 ced2
3aa9 e2c5 7e7b c4a1 7b82 a332 2848 83ed
adca d7e8 3228 5537 64eb 3105 2338 6ae2
[...]

实际上,这个项目的node_modules 下的所有package.json 文件都已损坏......对于所有模块!

但是,如果我的项目文件夹中有package.json,它不会受到影响,只有node_modules 文件夹下的那些会....

要解决此问题,我必须删除 node_modules 并使用 npm install 重新安装我的模块。不是很方便。 完成后,我的package.json 文件再次全部正确,具有预期的内容。

我认为这可能与我们的 McAfee 防病毒有关,但为什么它只会影响 node_modules 下的 package.json 文件,而不影响其他文件夹中的文件?

我在某处读到公司代理可以下载编码错误的package.json,但是当我安装我的模块时,package.json 完全正常。

因此,如果有人有任何想法/领导,我将不胜感激!

编辑: 自上次发布 npm (5.x) 以来,损坏停止发生……我不知道它是否与它有关,或者可能安装了 Windows 更新,或者我的 I/T 部门推送了软件更新……

【问题讨论】:

只是想知道,不同的package.jsons 是否显示了它们最后一次编辑/更新的“最近”时间?它只发生在您正在从事的项目中吗?还是针对您机器上的所有项目? 这不会发生在全局包(使用“-g”安装)上,而是发生在本地包上。 Node开发我做的不多,所以就在目前的项目上…… 【参考方案1】:

在这个阶段,如果是我,我会使用 SysInternals Process Monitor:不要假设任何具体内容,只需监控和记录系统上的所有 I/O,直到相关文件开始更改。您可以设置 Process Monitor 以记录磁盘操作,然后过滤日志,直到您看到哪个进程实际更改了名称中带有 .json 的任何内容。可能会有很多日志,您可能需要花一些时间来筛选它们,但它至少应该让您有一些东西可以查看,至少可以回答“什么程序正在更改这些文件?”这个问题。而不必猜测。

另一个想法:如果文件正在更改并且进程监视器没有显示任何内容,那么您可能有一个磁盘坏了。考虑在 USB 驱动器上完成所有工作一段时间,看看是否会发生相同的结果;如果文件在驱动器C: 上损坏,但在驱动器F:(或其他)上没有损坏,则可能表明您的磁盘开始出现故障。特别是对于 SSD,磁盘在开始死机时会做一些奇怪的事情。

跟踪此类随机文件更改可能很困难,但您可以通过多种方式确定原因;不要放弃希望,你会找到的。祝你好运!

【讨论】:

好建议!谢谢你。实际上,自上次发布 npm (5.x) 以来,损坏似乎停止了……我不知道它是否与它有关,或者可能安装了 Windows 更新,或者我的 I/T 部门推送了一个软件更新... 好吧,如果它再次启动,你有工具可以解释它的来源。您至少可以使用 Process Monitor 毫无疑问地证明,除了 npm 本身之外,没有任何东西触及 package.json 文件,甚至知道这些信息都是有价值的。【参考方案2】:

我没有要尝试的具体修复方法,但有一些通用的方法可以帮助您:

    卸载/重新安装节点和 npm - 显然,如果可能,您总是首先尝试。

    关闭所有不需要的服务/后台应用程序(尤其是扫描仪)并查看问题是否停止。如果是这样,请缩小范围并在测试时一一开启服务。也许制作一个脚本来运行你的应用程序足够多次,它通常会产生错误。

    是否有正在运行的 on-save 构建工具?咕噜咕噜/咕噜咕噜?这也可能是罪魁祸首。

我猜如果你尝试前两个建议你会发现你的问题。

此外,您提到的只读内容很奇怪,但您确定有适当的政策允许您设置这些权限吗? Windows 有时会令人困惑,因为您可以更改权限,有时看起来确实一切正常,但实际上并没有,您真的不会注意到,直到事情仍然无法正常工作并且您再次返回检查权限。

【讨论】:

【参考方案3】:

这很奇怪。与恶意软件无关的唯一原因可能是编码问题。 JSON 唯一有效的编码是 UTF-8、UTF-16 和 UTF-32(小端和大端),但 package.json 最安全的编码绝对是 UTF-8(没有 BOM)。

确保您永远不要在某些编辑器中打开它并将其保存为 UTF-8 以外的任何其他格式。

导致这种损坏的唯一其他原因可能确实是某些恶意软件。

有关 JSON 和字符编码的更多信息,请参阅这些答案:

JSON Specification and usage of BOM/charset-encoding What's different between UTF-8 and UTF-8 without BOM? Node js Syntax error unexpected token?

如果下载后一切正常,则可能的解决方法是在成功安装后将每个package.json 文件设为只读,然后查看何时会看到无法写入它们的错误。

我要研究的另一件事是它是否发生在每个目录中,或者可能仅发生在您共享或同步的某些目录中,或者位于网络安装设备上。

【讨论】:

感谢您的回答。所以,不,我根本不打开任何 package.json。我将在其中一个上尝试 ReadOnly,看看它是否有任何区别。没有理由被恶意软件感染。并且这些文件夹没有共享、同步或装载【参考方案4】:

我在 M.2 SSD 上的文件上遇到了类似的问题。硬盘项目运行良好,我从未遇到过任何损坏。

node_modules 中的随机文件被损坏并且服务/构建中断

到目前为止,我必须在我的 SSD 上继续这样做:

rm -rf node_modules
npm install

这是一个非常乏味的过程,但我别无选择。如果我找到解决方案,我会更新答案。

【讨论】:

以上是关于package.json 文件在一段时间后损坏的主要内容,如果未能解决你的问题,请参考以下文章

由于连接方在一段时间后没有正确答复或连接的主机没有反应

为啥我所有的 npm 项目都有 package-lock.json 文件但只在一台计算机上?

NPM5,package-lock.json 和 package.json 有啥区别?

node.js---package.json文件

配置package.json文件

检查 NPM package.json 和 package-lock.json 是不是兼容