2013-02-16 26 views
52

Tôi có một tập lệnh dài không được viết bởi tôi. Khi tôi chạy nó tôi nhận được:nhận thêm thông tin từ các thông báo "SyntaxError: Parse error"

phantomjs file.js 
SyntaxError: Parse error 

i kiểm tra ra hướng dẫn và --help, và tốt nhất tôi có thể nghĩ ra là:

phantomjs --debug=yes file.js 
(irrelevant debug statement from CookieJar) 
SyntaxError: Parse error 

Có cách nào tốt hơn để có được ít nhất một số dòng? hoặc bất kỳ gợi ý nào cả?

Trả lời

81

Chạy file với nút. Nếu có lỗi phân tích cú pháp, nó sẽ báo cáo lỗi đó.

Nếu tập tin là hợp lệ, sau đó nút cũng sẽ cố gắng chạy nó, mà sẽ thất bại nếu kịch bản của bạn phụ thuộc vào một cái gì đó không có sẵn trong nút môi trường của bạn. Vì vậy, bạn sẽ phải bỏ qua bất kỳ lỗi thời gian chạy nào.

Ví dụ, cho hello-world.js:

// Say Hello World twice 
for (var i=0; i<2; i++) { 
    console.log("Hello World")); 
} 

Run nó với nút:

node hello-world.js 

Output:

/home/someone/somewhere/hello-world.js:3 
    console.log("Hello World")); 
          ^
SyntaxError: Unexpected token) 
    at Module._compile (module.js:439:25) 
    at Object.Module._extensions..js (module.js:474:10) 
    at Module.load (module.js:356:32) 
    at Function.Module._load (module.js:312:12) 
    at Function.Module.runMain (module.js:497:10) 
    at startup (node.js:119:16) 
    at node.js:901:3 
+0

Đây là cách nhanh chóng và thông minh để chạy kiểm tra cú pháp cục bộ trên các tệp js. Tôi tìm thấy điều này nhanh hơn nhiều so với các công cụ trực tuyến, cộng với nó là không có ý kiến. Nhược điểm là cần nút, nhưng tôi nghi ngờ hầu hết các devs ảo sẽ có nút cài đặt. – danmux

+0

Điều gì sẽ xảy ra nếu nút gặp một số cửa sổ chung? Hoặc nếu phantom, chạy .. chromium? là một phiên bản khác với Node? Đó là ok cho một số trường hợp cơ bản tôi đoán –

+0

công thức của tôi trên tất cả các makefiles: 'tìm src/js/-name \ * js -exec node \ {\} \; 2> & 1 | grep -B 5 Cú phápError || exit 0 && exit 1; 'nó sẽ thất bại Thực hiện quy tắc nếu có bất kỳ lỗi cú pháp nào và hiển thị cho bạn dòng nơi nó xảy ra. – gcb

12

file.js của bạn chứa cú pháp không hợp lệ. Bạn nên kiểm tra nó bằng trình xác thực cú pháp. Một công cụ trực tuyến mà tôi đã tạo có thể là một giải pháp khả thi, hãy xem http://esprima.org/demo/validate.html.

+0

Chấp nhận này (nó là người đầu tiên đề nghị kiểm tra cú pháp ở những nơi khác) vì nó là rõ ràng rằng phantomjs không có cách nào để gợi ý tại lỗi cú pháp bởi bản thân. – gcb

2

Bạn cũng có thể sử dụng cú pháp xơ như JSLint hoặc jshint

+1

Một linter không nhiều hơn xác thực cú pháp. Trong nhiều trường hợp, nó có nhiều ý kiến ​​hơn. –

+0

Tôi đã thử jslint và có, nó đã quá dư luận và thoát khỏi mã sau khi một số 100 phàn nàn về sự lựa chọn của tôi về phong cách (tức là 'chức năng (var) {') hoặc sử dụng khoảng trắng, hoặc cái gì khác là phù phiếm ... tìm thấy tất cả các thiết lập để làm cho nó lành mạnh, tôi đã tìm thấy lỗi cú pháp. :/sẽ thử jshint lần sau! – gcb

11

Tìm thêm thông tin Fro m PhantomJS

Phiên bản tiếp theo của PhantomJS (có lẽ nó sẽ là 1.9.8, bất cứ điều gì xảy ra sau khi 1.9.7) sẽ lỗi đầu ra như thế này:

SyntaxError: Parse error 
http://localhost:9000/scripts/49e8b4f4.vendor.js:8 

Vì vậy, đó là hơi ích hơn thông điệp hiện tại .

Thật không may là không có bản dựng hàng đêm cho PhantomJS, do đó, tại thời điểm này, bạn sẽ cần phải biên dịch phiên bản chính của chính bạn nếu bạn muốn dùng thử.

Debugging được rút gọn file

Nếu bạn đang làm việc với một file được rút gọn, thường là số dòng sẽ không thể rất hữu ích, và thường gỡ lỗi tập tin un-minified sẽ không cung cấp cho bạn các lỗi phân tích cú pháp.

Để giải quyết này, một khi bạn nhận được phantomjs để cung cấp cho bạn tên của tập tin, bạn có thể sử dụng online demo of Esprima để có được một phân tích thực tế của mã JavaScript của bạn:

http://esprima.org/demo/parse.html

Từ đó, bạn có thể nhập các ngắt dòng chiến lược để tách biệt lỗi thực tế.

cụ Lint là Sub-tối ưu cho use-case này

Một công cụ lint như JSLint hoặc jshint có nhiều khăng khăng hơn một phân tích cú pháp thực, vì vậy nếu bạn đang tìm kiếm một lỗi cú pháp rất cụ thể, tôi sẽ khuyên bạn nên sử dụng trình phân tích cú pháp thực, vì nó sẽ chỉ kiểm tra tính hợp lệ của mã và không phải là nguyên tắc tạo kiểu được đề xuất. Tôi không ngụ ý các công cụ lint không có giá trị, chỉ là chúng sẽ không hữu ích để giải quyết loại vấn đề này.

+1

1.9.8 vẫn chỉ có lỗi cú pháp :: và trong tập lệnh 2.0 mới treo ngẫu nhiên, vì vậy chỉ cần Ctrl + Z;) – user956584

1

Tôi đã nhận được SyntaxError: Parse error khi cố gắng require một jquery được rút gọn tùy chỉnh.

Tôi đã tìm thấy giải pháp là thêm một dòng trống vào cuối jquery.min.js.

Hy vọng điều này sẽ giúp ai đó. Sử dụng PhantomJS 1.9.7.

0

Tôi sử dụng tập lệnh shell đơn giản sẽ chạy Phantom bình thường nếu không tìm thấy lỗi phân tích cú pháp, nếu không sẽ hiển thị lỗi. Nó chạy kịch bản thông qua nút, kiểm tra SyntaxError trong đầu ra và sau đó chạy lại nút đến thiết bị đầu cuối nếu có lỗi. Nó chuyển tất cả các đối số dòng lệnh cùng với Phantom.

Chế độ lỗi cho phương pháp này là nếu trình phân tích cú pháp nút của bạn khác biệt đáng kể với trình phân tích cú pháp Phantom của bạn. Tôi đủ gần để không bao giờ là vấn đề.

sử dụng: ./debug.sh --myArg1 val1 --myArg2 val2

debug.sh:

ERROR=$(node myscript.js 2>&1 >/dev/null | grep "SyntaxError") 

if [ "$ERROR" = "" ]; then 
    echo "No parse errors, running script..." 
    # run the script with Phantom and pass all the args to it 
    phantomjs accession.js $* 
else 
    echo "*********************************************************" 
    echo "********* There are parse errors in the script: *********" 
    echo "*********************************************************" 
    # show the errors by running again but not redirecting 
    node accession.js 
fi 
Các vấn đề liên quan