Ghi các đối tượng vào tệp với Node.js


82

Tôi đã tìm kiếm trên stackoverflow / google cho điều này, nhưng dường như không thể tìm ra.

Tôi đang tìm kiếm các liên kết mạng xã hội của một trang URL nhất định và hàm trả về một đối tượng có danh sách các URL.

Khi tôi cố gắng ghi dữ liệu này vào một tệp khác, nó sẽ xuất ra tệp [object Object]thay vì như mong đợi: [' https://twitter.com/#!/101Cookbooks ', ' http://www.facebook.com/ 101cookbooks '] như nó làm khi tôi console.log()kết quả.

Đây là nỗ lực đáng buồn của tôi khi đọc và ghi một tệp trong Node, cố gắng đọc từng dòng (url) và nhập thông qua một lệnh gọi hàm request(line, gotHTML):

fs.readFileSync('./urls.txt').toString().split('\n').forEach(function (line){
    console.log(line); 
    var obj = request(line, gotHTML); 
    console.log(obj); 
    fs.writeFileSync('./data.json', obj , 'utf-8'); 
});   

để tham khảo - gotHTMLchức năng:

function gotHTML(err, resp, html){ 
    var social_ids = []; 

    if(err){
        return console.log(err); 
    } else if (resp.statusCode === 200){ 
        var parsedHTML = $.load(html); 

        parsedHTML('a').map(function(i, link){
            var href = $(link).attr('href');
            for(var i=0; i<socialurls.length; i++){
                if(socialurls[i].test(href) && social_ids.indexOf(href) < 0 ) {
                    social_ids.push(href); 
                }; 
            }; 
        })
    };

    return social_ids;
};

3
[object Object]là một đối tượng toString. Nếu bạn muốn biểu diễn của đối tượng, hãy sử dụng JSON.stringify.
elclanrs

2
Hãy cẩn thận với JSON.stringify. Với mảng, bạn an toàn, nhưng khi các đối tượng có tham chiếu hình tròn, nó sẽ không thành công ( xem chủ đề này ). Các utilmô-đun xử lý tài liệu tham khảo tròn.
Jim Schubert

Câu trả lời:


70

obj là một mảng trong ví dụ của bạn.

fs.writeFileSync (tên tệp, dữ liệu, [tùy chọn]) yêu cầu một trong hai Stringhoặc Buffertrong tham số dữ liệu. xem tài liệu .

Cố gắng viết mảng ở định dạng chuỗi:

// writes 'https://twitter.com/#!/101Cookbooks', 'http://www.facebook.com/101cookbooks'
fs.writeFileSync('./data.json', obj.join(',') , 'utf-8'); 

Hoặc là:

// writes ['https://twitter.com/#!/101Cookbooks', 'http://www.facebook.com/101cookbooks']
var util = require('util');
fs.writeFileSync('./data.json', util.inspect(obj) , 'utf-8');

chỉnh sửa: Lý do bạn nhìn thấy mảng trong ví dụ của mình là vì việc triển khai của nút console.logkhông chỉ gọi toString, mà nó gọi util.format xem nguồn console.js


5
Nếu đối tượng của bạn có chứa mảng lớn, điều này sẽ không làm việc như kiểm tra phương pháp sẽ ra một cái gì đó như "45000 more ...]"
Coxer

96

Dựa trên những gì deb2fast đã nói, tôi cũng sẽ chuyển một vài tham số bổ sung vào JSON.stringify () để chuyển nó sang định dạng đẹp:

fs.writeFileSync('./data.json', JSON.stringify(obj, null, 2) , 'utf-8');

Tham số thứ hai là một chức năng thay thế tùy chọn mà bạn không cần trong trường hợp này null.

Tham số thứ ba là số lượng khoảng trắng được sử dụng để thụt lề. 2 và 4 dường như là những lựa chọn phổ biến.


nó sẽ gây ra vấn đề phụ thuộc vòng tròn. Không thể chuyển đổi phụ thuộc hai chiều thành JSON.
Ozan Ertürk

Tệp văn bản đã viết thiếu ký tự dòng mới ở cuối tệp. Bất kỳ cách nào để khắc phục điều này?
Friederbluemle

1
@friederbluemle - Bạn có thể + '\n'gọi lệnh stringify () đó để thêm dòng mới đó.
Guy

1
Điều này làm việc tốt nhất cho tôi vì sử dụng câu trả lời được chấp nhận đã cho tôi kết quả sai.
Anshuman Kumar

20

Nếu bạn đang ăn kiêng [object object]thì hãy sử dụngJSON.stringify

fs.writeFile('./data.json', JSON.stringify(obj) , 'utf-8');

Nó đã làm việc cho tôi.


10

Theo kinh nghiệm của tôi, JSON.stringify nhanh hơn một chút so với use.inspect. Tôi đã phải lưu đối tượng kết quả của truy vấn DB2 dưới dạng tệp json, Truy vấn trả về một đối tượng có 92k hàng, quá trình chuyển đổi mất rất nhiều thời gian để hoàn thành với use.inspect, vì vậy tôi đã thực hiện kiểm tra sau bằng cách ghi cùng một đối tượng bản ghi 1000 vào một tệp có cả hai phương pháp.

  1. JSON.Stringify

    fs.writeFile('./data.json', JSON.stringify(obj, null, 2));
    

Thời gian: 3:57 (3 phút 57 giây)

Định dạng kết quả:

[
  {
    "PROB": "00001",
    "BO": "AXZ",
    "CNTRY": "649"
   },
  ...
]
  1. use.inspect

    var util = require('util');
    fs.writeFile('./data.json', util.inspect(obj, false, 2, false));
    

Thời gian: 4:12 (4 phút 12 giây)

Định dạng kết quả:

[ { PROB: '00001',
    BO: 'AXZ',
    CNTRY: '649' },
    ...
]

4

bạn có thể thử làm JSON.stringify (obj);

Như thế này

 var stringify = JSON.stringify(obj);
fs.writeFileSync('./data.json', stringify , 'utf-8'); 

1

Chỉ trong trường hợp bất kỳ ai khác tình cờ gặp phải điều này, tôi sử dụng thư viện fs-extra trong nút và ghi các đối tượng javascript vào một tệp như thế này:

const fse = require('fs-extra');
fse.outputJsonSync('path/to/output/file.json', objectToWriteToFile); 
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.