Mam problemy z próbą napisania bufora porcji w pliku. Mój problem jest zasadniczo taki, że plik zawiera tylko ostatnie bajty bufora wyjściowego. Bufor porcji jest bardzo duży, a mój plik.Out jest obcięty, ostatnie elementy są poprawne.

Oto mój kod

    var reqChart = http.request(chart, function(res1) {

    res1.setEncoding( 'utf8' );

    res1.on('data', function (chunk) {

        var fs = require('fs');


        //var b = new Buffer(chunk.length);
        var c = "";

        for (var i = 0;i < chunk.length;i++) {
         //   b[i] = chunk[i];
            c = c  + chunk[i]
        }

        console.log(c);

        fs.writeFile("rich.txt", c,  "utf-8",function(err) {
            if(err) {
                console.log(err);
            } else {
                console.log("The file was saved!");
            }
        }); 

    });
});

A jeśli jesteś zainteresowany tutaj, to początek Wejście Wejście do mojego pliku vs na początku "konsoli.log" mojej zmiennej ... Próbowałem napisać "konsolę.log" do pliku, ale w tym samym wynikach.

Plik

0,0.120179572670496],[1498028100000,0.105581318680705],[1498028400000,0.167319933562371],[1498028700000,0.147574197583768],[1498029000000,0.114172853959319],[1498029300000,0.241186960587686],[1498029600000,1.45701290672775],[1498029900000,0.154756395075166],[1498030200000,0.0836631006369253],[1498030500000,0.0800486694467188],[1498030800000,0.0861569133026863],[1498031100000,0.092360872083502],[1498031400000,0.0790707908354345],[1498031700000,0.129877438815933],[1498032000000,0.118812121796025],[1498032300000,0.0989746376933164],[1498032600000,2.30001837257628],[1498032900000,0.313639093279438],[1498033200000,0.227936449562983],

Bufor / zmienna / dziennik

{"requestData":{"options":{"width":950,"gui_component_mode":1,"exporttocsv":1,"only_stacks_in_legend":false,"reverse_axis":false,"height":446,"datasetTitle":"","legend_average":false,"legend_maximum":false,"legend_minimum":false},"model_group":101,"name":"autil_17","model":"nmis_graph","dataset_id":0,"owner_cid":"c3","data_source_type":"chart","model_view":"graph","parameters":{"graph_type":"interface","resource_index":"17","nmis_data_type":null,"value_column":"value","node":"RT01459","axis":0,"end_date_raw":1498095300,"substitutions":{"time.start":1497922702,"time.end":1498095502},"time_column":"time","translation":"","field":"","lineType":"line","period":"2d","index_graph_type":"autil","resource":"interface","start_date_raw":1497922500,"resolution":300,"class":null},"data_source":"local_nmis","translation":null},"replyData":{"options":{"subtitleText":"ENTERPRISE_RT01","titleText":"Interface gigabitethernet0-2-3913","legend_raw":"    Avg In     Max In Avg 12.76 % Max 98.99 % \\n     Avg Out     Max Out Avg 4.98 % Max 52.49 % \\n","yAxis0TitleText":"% Avg Util"},"stacking":"normal","meta_data":{"time_start":1497922500,"start_date_input":"2017-06-19 20:35:00","end_date_input":"2017-06-21 20:35:00"},"data":[{"yAxis":0,"reverse_axis":0,"valueDecimals":2,"value_min":-98.9864025844157,"color":"#00BFFF","suffix":"","dataset_multiplier":1,"sum":-7373.17229868631,"connectNulls":0,"stack":1,"value_max":-0.0591203443255937,"name":"Avg In","data":[[1497922500000,-0.7137202476565],[1497922800000,-1.43305756579003],[1497923100000,-0.150464409649807],[1497923400000,-0.150475661479925],[1497923700000,-0.100369773564214],[1497924000000,-0.0893947123021048]

Myślałem, że może w funkcji limitu czasu lub coś, ale dziennik pisze informacje terminal, może coś brakuje.

0
Ricardo Alan Vargas Gamboa 26 czerwiec 2017, 19:27

3 odpowiedzi

Najlepsza odpowiedź

Zdajesz sobie sprawę, że zresetujesz C na każdym kawałku, jak jego lokalnie się rozwija?:

var c="";//not resetted
res1.on('data', function (chunk) {
    c+=chunk;
}

I musisz czekać na strumień, aby zakończyć:

res1.on("end",function(){
 console.log(c);
var fs = require('fs');
 fs.writeFile("rich.txt", c,  "utf-8",function(err) {
        if(err) {
            console.log(err);
        } else {
            console.log("The file was saved!");
        }
  }); 
});
1
Jonas Wilms 26 czerwiec 2017, 16:41

Funkcja pipe dla strumieni ułatwiłoby ci życie.

const fs = require('fs');
const http = require('http');

const output = fs.createWriteStream('output.html'); // change to rich.txt
const url = 'http://example.com'; // change to chart URL

http.get(url, response => {
    response.pipe(output);
});
1
Brett Beatty 26 czerwiec 2017, 16:39

Problem, który masz, jest to, że piszesz plik, gdy jesteś w stream.on('data',.... Musisz dodać wszystkie te dane do pliku i użyć stream.on('end',... zdarzenia, aby napisać do pliku. Mam nadzieję, że ten przykład pomoże

var fs = require('fs');
// Some example of getting original data
var readableStream = fs.createReadStream('file.txt');
var data = '';

readableStream.on('data', function(chunk) {
    data+=chunk;
});

readableStream.on('end', function() {
    console.log(data);
    fs.writeFile("rich.txt", data,  "utf-8",function(err) {
        if(err) {
            console.log(err);
        } else {
            console.log("The file was saved!");
        }
    }); 
});

Teraz kopiujesz swój kod i modyfikowanie go:

var reqChart = http.request(chart, (res1) => {
    res1.setEncoding('utf8');
    var fs = require('fs');
    var c = "";

    res1.on('data', function (chunk) {
        //var b = new Buffer(chunk.length);
        for (var i = 0; i < chunk.length; i++) {
            //   b[i] = chunk[i];
            c = c + chunk[i]
        }
        console.log(c);
    });

    res1.on('end', function () {
        fs.writeFile("rich.txt", c, "utf-8", function (err) {
            if (err) {
                console.log(err);
            } else {
                console.log("The file was saved!");
            }
        });
    })
});
1
Rafael del Rio 26 czerwiec 2017, 16:39