2013-07-30 33 views
9

Tôi đang cố gắng quản lý phụ thuộc gói nút của mình. Tôi muốn có thể cài đặt tất cả các phụ thuộc bắt buộc bằng cách chạy lệnh và từ những gì tôi đã đọc, một cách để đạt được điều này là sử dụng tệp package.json và chạy npm install. Vì vậy, tập tin JSON của tôi trông như thế này:npm cài đặt không thể đọc package.json

{ 
"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" 
} 
} 

Tuy nhiên npm install báo cáo các lỗi sau:

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 

Bất cứ ai biết tại sao?

+0

Gói package.json cụ thể này hoạt động tốt cho tôi. –

+0

@MerynStol thật tuyệt vời. Vui mừng khi biết nó thực sự là đơn giản. Có thể đó là vấn đề nền tảng. Tôi đang chạy lệnh đó trên Windows 8 và kiến ​​trúc 64 bit – Ceilingfish

+1

Với "Mã thông báo không mong muốn?" lỗi, có lẽ có một số ký tự lạ (vô hình) trong tệp json. Có thể thử trình soạn thảo văn bản khác nhau, hoặc fiddle với các thiết lập của trình soạn thảo của bạn. Sau đó, lưu lại tệp package.json. Tôi muốn sử dụng UTF-8 ở mọi nơi. –

Trả lời

13

câu trả lời đúng:

biên tập của bạn thêm một byte-trật tự-mark đến tập tin JSON, mà làm cho octet-stream một văn bản JSON không hợp lệ.

JSON RFC nói:

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.

 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 

Các bug report bạn đề cập đã bị đóng cửa vì lý do này. Từ sự hiểu biết của tôi, bất kỳ văn bản mã hóa ASCII hợp lệ nào cũng sẽ là UTF-8 hợp lệ, vì vậy cùng với sự vắng mặt của BOM, nó giải thích lý do tại sao nó hoạt động như mong đợi.

Nói chung, tôi nghĩ bạn nên thiết lập trình soạn thảo văn bản để lưu tệp trong UTF-8, không có dấu thứ tự byte. Xem What's different between UTF-8 and UTF-8 without BOM? để thảo luận. Mỗi What encoding is expected for Node.js source code?, Node.js sẽ chấp nhận các ký tự không phải ASCII trong các tệp nguồn JS được mã hóa theo cách này. Điều này có thể hữu ích khi bạn muốn nhúng một chuỗi không phải ASCII vào đâu đó trong mã nguồn.

+0

ASCII là tập hợp con của UTF-8, bỏ qua BOM chỉ gây ra sự cố khi bạn bắt đầu sử dụng các ký tự có dấu trọng âm hoặc ideograph xuất hiện trong bộ ký tự asiatic (bất cứ điều gì trên mã ký tự 255). Tôi đoán giải pháp lý tưởng là biên tập viên của tôi hỗ trợ mã hóa cụ thể mà thông số JSON sử dụng để xác định tệp và kích hoạt cơ chế phát hiện đó dựa trên phần mở rộng tệp .json, thật đáng buồn là nhóm Visual Studio dường như không có để điều này (và tôi bằng cách nào đó nghi ngờ họ sẽ bao giờ) – Ceilingfish

+1

@Ceilingfish Có lẽ một trong những giải pháp được đăng ở đây hoạt động? http://stackoverflow.com/questions/5406172/utf-8-without-bom –

+0

Chúa biết tại sao, Nhưng trong trường hợp của tôi, khi tôi đã lưu với BOM, nó hoạt động. Nếu không, nó không thể phân tích cú pháp JSON. Tôi đang sử dụng văn bản tuyệt vời 2. –

1

Giải pháp duy nhất là chỉ định phiên bản chính xác của phụ thuộc. Đôi khi NPM không nhận ra> hoặc .x

1

npm ERR! Unexpected token ?

Trong trường hợp không có BOM, hãy kiểm tra xem bạn có "" không? ở đâu đó trong tệp hoặc các lỗi khác, ví dụ: thiếu hoặc bổ sung ",".