npm install无法读取package.json

npm install cannot read package.json

我正在尝试管理我的节点包依赖项。我希望能够通过运行一个命令来安装所有必需的依赖项,根据我所读到的,实现这一点的一种方法是使用package.json文件并运行npm install。所以我的json文件如下:

1
2
3
4
5
6
7
8
9
10
11
{
"name":"Name-Of-The-Thing",
"description":"The Thing's Name",
"author":"The Dude <[email protected]>",
"dependencies": {
     "mocha":">= 1.12.0",
     "mocha-phantomjs":">= 3.1.0",
     "chai":">= 1.7.2",
     "phantomjs":">= 1.9.1"
 }
}

但是,npm install报告了以下错误:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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\
odejs\\\
ode.exe""C:\\Program Files\
odejs\
ode_modules\
pm\\bin\
pm-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
pm-debug.log
npm ERR! not ok code 0

有人知道为什么吗?


正确答案:

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

JSON RFC说:

JSON text SHALL be encoded in Unicode. The default encoding is
UTF-8.

Since the first two characters of a JSON text will always be ASCII
characters [RFC0020], it is possible to determine whether an octet
stream is UTF-8, UTF-16 (BE or LE), or UTF-32 (BE or LE) by looking
at the pattern of nulls in the first four octets.

1
2
3
4
5
       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格式保存文件,而不使用字节顺序标记。看到没有BOM的utf-8和utf-8有什么不同吗?供讨论。node.js源代码需要什么编码?,node.js将接受以这种方式编码的JS源文件中的非ASCII字符。当您想在源代码的某个地方嵌入一个非ASCII字符串时,这很方便。


npm ERR! Unexpected token ?

如果没有物料清单,还要检查您是否只有一个"?"文件中的某个位置或其他错误,例如丢失或附加""。


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