2014-10-08 10 views
5

Gần đây tôi đã cố tải mô-đun bson (JSON nhị phân) trong node.js. Các tài liệu API không rõ ràng, vì vậy tôi nghĩ rằng việc kiểm tra các đối tượng sẽ giúp tôi. Kết quả của cuộc kiểm tra đã gây bối rối.% j specifier trong console.log không bao gồm một số thuộc tính

Cuối cùng tôi phát hiện ra là vì tôi đang sử dụng %j "nằm" - nó không in tất cả các phím từ điển của đối tượng! (Tôi đang sử dụng thuật ngữ Python cho "thuộc tính" như những thứ được tham chiếu bằng dấu chấm và "từ điển" cho những thứ được tham chiếu bằng dấu ngoặc đơn, vì tôi không biết tên riêng cho những thứ này trong JS.)

Đây là một ví dụ:

var bson = require("bson"); 
console.log("bson as %%j: %j", bson); 
console.log("bson as console.log: ", bson); 

và đây là kết quả:

bson as %j: {"BSONPure":{},"BSONNative":{}} 
bson as console.log: { BSONPure: 
    { Code: [Function: Code], 
    Symbol: [Function: Symbol], 
    BSON: 
     { [Function: BSON] 
     BSON_INT32_MAX: 2147483647, 
     BSON_INT32_MIN: -2147483648, 
     BSON_INT64_MAX: 9223372036854776000, 
     BSON_INT64_MIN: -9223372036854776000, 
... 

tôi nghĩ kể từ x.key cũng giống như x["key"], mà điều này có nghĩa các thuộc tính và các phím từ điển có "điều tương tự" trong JS. Tôi tìm thấy sau khi thử nghiệm rằng BSON.BSONPure{}, tuy nhiên BSON.BSONPure.BSONBSON.BSONPure["BSON"] là đối tượng function!

Điều này khiến tôi tin rằng bất cứ điều gì "%j" thực hiện, bằng cách nào đó phải loại trừ một số khóa. Làm cách nào để quyết định loại khóa nào cần loại trừ? Tại sao nó thậm chí sẽ làm điều đó? JS đôi khi là một ngôn ngữ khó hiểu!

liên quan Github vé: https://github.com/mongodb/js-bson/issues/97

+0

Cả hai thứ đều giống nhau (như bạn nói, 'x.key' và' x ["key"] 'là hoàn toàn tương đương) và chúng được gọi là * thuộc tính *. – Bergi

Trả lời

14

Down in the node.jssource, các %j kết quả giữ chỗ trong một cuộc gọi đến JSON.stringify() trên lập luận thông qua.

Vấn đề là, khi chuyển biến số bson, bạn không chuyển đối tượng JSON hợp lệ. Bạn đang truyền mô-đun node.js, trong số những thứ khác đã xuất các hàm.

Vì vậy, điều gì sẽ xảy ra khi JSON.stringify() truy cập một chức năng?

Nếu không xác định, một chức năng, hoặc một ký hiệu được gặp phải trong chuyển đổi nó, hoặc được bỏ qua (khi nó được tìm thấy trong một đối tượng) hoặc bị kiểm duyệt để null (khi nó được tìm thấy trong một mảng). (MDN)

Vì vậy, hành vi mà bạn đang nhìn thấy là hoàn toàn mong đợi, bạn đang cố gắng đăng nhập một cái gì đó như JSON đó không phải là hợp lệ JSON.

> JSON.stringify({name: "Bob"}) 
> "{"name":"Bob"}" 

> JSON.stringify({func: function(){}}) 
> "{}" 
+1

Tôi đoán điều này có ý nghĩa. Khi tôi in ra một số đối tượng, tôi đã thử làm 'console.log (" x là "+ x)' trong đó cung cấp cho 'x là vô ích' đối tượng Object] '. Vì vậy, tôi googled làm thế nào để in công cụ trong JS, và câu trả lời tôi nhìn vào nói với tôi sử dụng% j, mà làm việc cho các ví dụ cụ thể. Nhưng sau đó tôi bắt đầu sử dụng% j là "phiên bản JS của repr()" của Python mà không thực sự đọc những gì nó làm. Cảm ơn bạn đã tham khảo tài liệu – picomancer

Các vấn đề liên quan