2017-07-12 4 views
0

Ich benutze einen Mungo-Cursor, um eine große Menge von Daten in Teilen zu erhalten und sie progressiv zu senden, wenn ich jedes Teil erhalte. Um dies zu tun, verwende ich die Methode res.write().Gibt es ein Zeitlimit für die 'response.write' Methode in node.js?

cursor.on('data', (doc) => { 
    /*Array opening bracket only sent at the start*/ 
    if (total === 0) { 
    res.write('['); 
    } 
    docs.push(doc); 
    total += 1; 

    /*Limit indicates each CSV length*/ 
    if (docs.length === limit) { 
    res.write(JSON.stringify(docs)); 
    res.write(','); 
    docs = []; 
    } 
}); 

cursor.on('end', (doc) => { 
    ... 
    /*Closing bracket sent after the array is completed*/ 
    res.write(']'); 
    ... 
    res.end(); 
}); 

Wie oben in dem Code gesehen, ich habe eine Variable Grenze zu wissen, wann den nächsten Teil der Antwort zu schreiben. Wenn diese Variable zu groß ist, benötigt sie mehr Zeit, um jedes Teil zusammenzusetzen, und die Abfrage wird beendet, bevor ich sie schreiben kann. (Wenn ich diese Variable reduziere, funktioniert es gut). In diesem Fall enthält die Antwort nur die Zeichenfolge: '['. Als hätte es nach einer gewissen Zeit die Methode res.end() aufgerufen.

Meine Frage ist: Gibt es eine Zeitüberschreitung, wenn Sie die res.write() Methode verwenden, nach der (wenn Sie nicht weiter schreiben oder senden Sie die Antwort) res.end() heißt? Oder fehlt mir etwas?

+0

'response.write' erwarten ein node.js Methode ist https: //nodejs.org/api/http.html#http_response_write_chunk_encoding_callback – kuzyn

Antwort

0

Es gibt kein Timeout für res.write. Wenn man sich die doc jedoch aussehen, während die Header implizit zum ersten Mal eingestellt response.write aufgerufen wird, kann sie nicht genau, was Sie wollen

ich versuchen würde, auf diese Header explizit festgelegt, bevor das Senden von Daten, dh, wenn Sie empfangen die Anfrage:

response.setHeader('Connection', 'Transfer-Encoding'); 
response.setHeader('Content-Type', 'text/html; charset=utf-8'); 
response.setHeader('Transfer-Encoding', 'chunked'); 

ich auch eine einfache Prüfung zu response.write sicherstellen möchte hinzufügen, dass jeder Chunk gespült wird:

/*Limit indicates each CSV length*/ 
 
    if (docs.length === limit) { 
 
    let chunk = JSON.stringify(docs); 
 
    if(res.write(`${chunk},`)) { 
 
     docs = []; 
 
    } else { 
 
     console.log(`oops! something is wrong with chunk ${chunk}`); 
 
    } 
 
    }

Schließlich möchte ich diese Antwort https://stackoverflow.com/a/16999405/3253893 lesen, zu verstehen, warum dies könnte eine schlechte Idee sein, wenn Sie mehr als eine Abfrage zu einem Zeitpunkt

Verwandte Themen