2015-07-10 16 views
5

W kolekcji Mongodb znajduje się 20 000 rekordów. Eksportuję wszystkie te rekordy w pliku CSV. Jestem wysłać odpowiedź częściową pomocą tego:Nodejs wysyłają częściową odpowiedź

res.writeHead(200, { 
        "Content-Type": "application/csv", 
        "Content-disposition": "attachment; filename='import.csv'" 
}); 

res.write(data + '0', "binary"); 

Powyższy kod jest wykonywany w partii 500. Jestem kończącym się przy użyciu tego kodu, gdy wszystkie dane są przetwarzane.

if (++responseCount == loopCount) { 
    res.end(); 
} 

Ale mam ten błąd:

nie można ustawić nagłówki po ich wysłaniu.

Ale dostaję plik pobrany z 500 rekordami.

Oto mój pełny kod.

var exportData = function (req, res, next) { 

var limit = 500; 
var responseCount = 0; 
var loopCount = 1; 
var size = 30000; 

//Get 500 records at one time 
var getData = function (req, start, cb) { 
    req.db.collection('items').find().skip(start).limit(limit).toArray(function (err, records) { 
     if (err) throw err; 
     cb(null, records); 
    }); 
}; 

if (size > limit) { 
    loopCount = parseInt(req.size/limit); 

    if ((req.size % limit) != 0) { 
     loopCount += 1; 
    } 
} 

for (var j = 0; j < loopCount; j++) { 

    getData(req, limit * j, function (err, records) { 

     if (err) throw err; 

     records.forEach(function (record) { 
      //Process record one by one 
     }); 

     res.write(records); 

     if (++responseCount == loopCount) { 
      res.setHeader('Content-type', 'application/csv'); 
      res.setHeader("Content-disposition", 'attachment; filename="import.csv"'); 
      res.end(); 

     } 

    }); 
} 
}; 
+0

można pokazać swój pełny kod? Problem nie leży w tym, co tu umieściłeś. Idealnie wystarczy, aby uruchomić i zobaczyć problem (kpiąc z danych może być dobrym pomysłem). –

+0

Wysyłasz odpowiedź, zanim zakończy się operacja wsadowa. – bluesman

+0

Problem został rozwiązany. http://stackoverflow.com/questions/31339652/nodejs-send-partial-response/31398864#31398864 – Rohit

Odpowiedz

1

To stwierdzenie

res.writeHead(200, { 
        "Content-Type": "application/csv", 
        "Content-disposition": "attachment; filename='import.csv'" 
}); 

należący do nagłówka sekcji, gdy odpowiedź jest send.So, wysyła nagłówek.
res.end() również wysłać header.So, w ten sposób wysyłać nagłówek ponownie.

Proszę odnieść się ten jeden stackoverlflow pytanie w


edycji kodu:

data.pipe(resp); 
resp.end(); 

Proszę odnieść to jedno za bardziej pipe

+0

Dostałem błąd, nawet jeśli ten warunek nie jest spełniony. – Rohit

2

Dlaczego nie tylko przesyłać dane? Możesz użyć funkcji mangusty query.stream. Przykład z dokumentu:

// follows the nodejs 0.8 stream api 
Thing.find({ name: /^hello/ }).stream().pipe(res) 

Strumień zajmie się przepływem danych. Jako node.js strumienia można również słuchać na imprezach:

// manual streaming 
var stream = Thing.find({ name: /^hello/ }).stream(); 

stream.on('data', function (doc) { 
    // do something with the mongoose document 
}).on('error', function (err) { 
    // handle the error 
}).on('close', function() { 
    // the stream is closed 
}); 
1
var exportData = function (req, res, next) { 

    res.writeHead(200, { 
     'Content-Type': 'application/csv', 
     'Content-Disposition': 'attachment; filename="import.csv"' 
    }); 

    var limit = 500; 
    var responseCount = 0; 
    var loopCount = 1; 
    var size = 30000; 

    //Get 500 records at one time 
    var getData = function (req, start, cb) { 
     req.db.collection('items').find().skip(start).limit(limit).toArray(function (err, records) { 
      if (err) throw err; 
      cb(null, records); 
     }); 
    }; 

    if (size > limit) { 
     loopCount = parseInt(req.size/limit); 

     if ((req.size % limit) != 0) { 
      loopCount += 1; 
     } 
    } 

    for (var j = 0; j < loopCount; j++) { 

     getData(req, limit * j, function (err, records) { 

      if (err) throw err; 

      records.forEach(function (record) { 
       //Process record one by one 
      }); 

      res.write(records); 

      if (++responseCount == loopCount) { 
       res.end(); 
      } 

     }); 
    } 
}; 
+1

Przesyłając odpowiedzi, dodaj trochę wyjaśnienia do swojego kodu. – MayorMonty

+0

Rzeczywiście. Niektóre wyjaśnienia kodu powinny być w porządku. – MoshMage

+0

Czy napisz wyślij dane natychmiast, jako odpowiedź częściową, lub zapisz dane do bufora, czekając na wysłanie? –

Powiązane problemy