npm安装无法读取package.json文件

10

我想要管理我的节点包依赖。我希望能够通过运行一个命令来安装所有必需的依赖项,根据我所阅读的资料,实现这一目的的一种方法是使用一个 package.json 文件并运行 npm install。因此我的 JSON 文件看起来像这样:

{
 "name": "Name-Of-The-Thing",
 "description": "The Thing's Name",
 "author": "The Dude <the.dude@dudethinking.com>",
 "dependencies": {
      "mocha":">= 1.12.0",
      "mocha-phantomjs":">= 3.1.0",
      "chai":">= 1.7.2",
      "phantomjs":">= 1.9.1"
 }
}

然而npm install报告了以下错误:

npm ERR! Failed to parse json
npm ERR! Unexpected token ?
npm ERR! File: C:\Path\To\The\Thing\package.json
npm ERR! Failed to parse package.json data.
npm ERR! package.json must be actual JSON, not just JavaScript.
npm ERR!
npm ERR! This is not a bug in npm.
npm ERR! Tell the package author to fix their package.json file. JSON.parse

npm ERR! System Windows_NT 6.2.9200
npm ERR! command "C:\\Program Files\\nodejs\\\\node.exe" "C:\\Program Files\\nodejs\\node_modules\\npm\\bin\\npm-cli.js" "test"
npm ERR! cwd C:\Path\To\The\Thing
npm ERR! node -v v0.8.15
npm ERR! npm -v 1.1.66
npm ERR! file C:\Path\To\The\Thing\package.json
npm ERR! code EJSONPARSE
npm ERR!
npm ERR! Additional logging details can be found in:
npm ERR!     C:\Path\To\The\Thing\npm-debug.log
npm ERR! not ok code 0

有人知道为什么吗?


这个特定的 package.json 对我来说运行良好。 - Myrne Stol
@MerynStol 太棒了。很高兴知道它真的是那么简单。也许这是一个平台问题。我在 Windows 8 上运行该命令,并且是 64 位架构。 - Ceilingfish
1
由于出现了“Unexpected token ?”错误,可能是JSON文件中存在一些奇怪(不可见)的字符。也许尝试使用不同的文本编辑器或调整编辑器的设置。然后重新保存package.json文件。我会在任何地方都使用UTF-8编码。 - Myrne Stol
1
@MerynStol 谢谢你的想法,它给了我灵感!文件已经被编码为UTF-8,但是那个错误信息让我有些怀疑,所以我改成了ASCII编码(即删除了BOM),然后它就很好地工作了!谢谢! - Ceilingfish
事实上,这里有一个关于该问题的错误报告 https://github.com/isaacs/npm/issues/3358 - Ceilingfish
3个回答

13

正确的答案:

您的编辑器在JSON文件中添加了一个字节顺序标记,这使得八位字节流成为无效的JSON文本。

JSON RFC指出:

JSON文本应使用Unicode编码,默认编码为UTF-8。

由于JSON文本的前两个字符始终是ASCII字符[RFC0020],因此可以通过查看前四个八位字节中null的模式来确定八位字节流是UTF-8、UTF-16(BE或LE)还是UTF-32(BE或LE)。

       00 00 00 xx  UTF-32BE
很抱歉,我当前只能用英文回答问题。
       00 xx 00 xx  UTF-16BE
       xx 00 00 00  UTF-32LE
       xx 00 xx 00  UTF-16LE
       xx xx xx xx  UTF-8

你提到的错误报告已经因此关闭。

根据我的理解,任何有效的ASCII编码文本都恰好是有效的UTF-8编码,因此加上BOM不存在的情况,这就解释了为什么它现在按预期工作。

通常来说,我认为你应该设置你的文本编辑器以UTF-8格式保存文件,并且不要加入字节顺序标记。参见UTF-8和无BOM UTF-8有什么区别?以获得更多讨论。根据Node.js源代码期望的编码是什么?,Node.js将接受用这种方式编码的JS源文件中的非ASCII字符。当你想在源代码中嵌入非ASCII字符串时,这可能会很方便。


ASCII是UTF-8的子集,省略BOM只有在开始使用出现在亚洲字符集(任何超过字符代码255的东西)中的重音字符或表意文字时才会出现问题。我想理想的解决方案是让我的编辑器支持JSON规范用于识别文件的特定编码,并根据.json文件扩展名激活该检测机制,但可惜的是,Visual Studio团队似乎还没有解决这个问题(而且我不确定他们是否会解决)。 - Ceilingfish
1
@Ceilingfish 也许这里发布的解决方案之一可以解决问题?https://dev59.com/vW035IYBdhLWcg3wc_wm - Myrne Stol
天知道为什么,在我的情况下,当我使用BOM保存时,它可以工作。否则它无法解析JSON。我正在使用Sublime Text 2。 - Sushant Gupta

1

npm错误!意外的标记?

如果没有BOM,请检查文件中是否有“?”或其他错误,例如缺少或多余的“,”。


0
唯一的解决方案是指定依赖项的确切版本。NPM有时无法识别“>”或“.x”。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接