2016-07-01 15 views
0

Ich habe den folgenden CodeSenden Reaktion nach fs.readFile länger ausgeführt wird iterativ

var express = require('express'); 
var Promise = require('bluebird'); 
var fs = Promise.promisifyAll(require('fs')); 
var path = require("path"); 
var langs = fs.readdirSync({directory having multiple directories}); 
var arr = []; 
for(var v in langs){ 
    var filename = config.path.storage + "/" + langs[v] +"/assets/_assets.json"; 
     fs.readFile(filename, "utf8", function(err, data) { 
     if (err) throw err; 
     res.write(data); 
     //res.end(); 
    }); 
} 
res.end(); 

Was ich tun möchte, ist, wenn alle Dateien in den Verzeichnissen (lang in diesem Fall - langs enthält: ['ar-dz', 'en-gb', 'en-us']) gelesen werden, möchte ich eine res.send() an den Client tun.

Ich habe versucht, das 'fs' Modul über 'bluebird' Modul zu promiden. Ich nehme an, der Rückruf in fs.readFileAsync() verursacht das Problem, gibt es einen Weg um es herum?

+0

Becoz 'res.end()' wird, bevor eine der 'res.write' Anrufe ausgeführt werden sollen sind – Ankur

+0

Ordnung ausgeführt, I Ich formatiere den Code neu. Ich verstehe, warum die Header nicht gesetzt werden können, aber das eigentliche Problem, wie der Titel sagt, brauche ich eine Möglichkeit, meinen Code nach der iterativen Ausführung von readFile() –

Antwort

1

Can't set headers after they are sent. tritt auf, weil Sie res.write() aufrufen, nachdem Sie res.end() aufgerufen haben. Dies geschieht, weil die asynchrone Antwort auf fs.readFile() später kommt, nachdem Ihre for Schleife abgeschlossen ist. Stattdessen müssen Sie Ihre Versprechen verwenden, um das Ergebnis Ihrer asynchronen Vorgänge zu koordinieren, und wenn alle fertig sind, können Sie Ihre Antwort mit allen Daten senden.

Sie können Ihre Drossel Versprechen Bibliothek verwenden zu tun, dass dies wie:

fs.readdirAsync(...).map(function(file) { 
    return fs.readFileAsync(file, 'utf8'); 
}).then(function(arrayOfData) { 
    res.send(arrayOfData.join("")); 
}).catch(function(err) { 
    // send some error response here 
}); 
+0

@RamanathanIyer auszuführen - Hat das deine Frage beantwortet? – jfriend00