Ich baue eine Web-App mit Node.js, und ich bin an einem Punkt, wo ich ein Tar-Archiv erstellen muss eines Verzeichnisses von PDFs. Die Anwendung läuft auf einer VM mit Ubuntu 14.04 Server. Mein Code, dies zu tun ist unten dargestellt:Node.js - Exec-Befehl für TAR-Dateien funktioniert beim ersten Mal korrekt, erzeugt aber bei der nächsten Ausführung fehlerhafte tar-Inhalte
function tarDirectory(path, token, callback) {
var exec = require('child_process').exec;
var cmd = 'cd ' + path + ' && tar -cvf genericName-' + token + '.tar' + ' ' + token;
exec(cmd, function(error, stdout, stderr) {
console.log(stdout);
console.log(stderr);
if (error) {
console.error(error);
}
if(callback) callback();
});
}
und diese tarDirectory Funktion durch den folgenden Code aufgerufen wird:
router.post('/files/generate', function(req, res, next) {
IDList = req.body['IDs[]'];
token = req.body['token'];
// if just a single file being generated
if (typeof req.body['IDs[]'] === "string"){
filehelper.generateFile(IDList[0], req.app.locals.site.basedir + "temp/", token);
}
// if multiple files being generated
else {
IDList.forEach(function(id) {
filehelper.generateFile(id, req.app.locals.site.basedir + "temp/", token);
});
}
filehelper.tarDirectory(req.app.locals.site.basedir + "temp/", token, res.end);
});
Der Code erwartet eine Post-Anforderung mit dynamischen Daten, die durch Klicken auf eine Schaltfläche erzeugt wird in meiner Web-App, und wird dann Dateien basierend auf den Daten erstellen und es in ein Verzeichnis tarieren. Das alles funktioniert gut und gut ... das erste Mal. Wenn ich zum ersten Mal auf den Knopf klicke, wird das Tar erzeugt, und wenn ich es öffne, sind die clientseitigen PDFs identisch mit denen auf dem Server. Wenn ich innerhalb einer Stunde erneut klicke, erhalte ich zwar eine TAR-Datei, aber wenn ich das Archiv öffne und entpacke, sind die PDFs alle beschädigt und etwa die Hälfte der erwarteten Byte-Größe. Ich bin hier ratlos ... Ich hatte den Verdacht, dass es mit der unsachgemäßen Handhabung des Schließens von Strom in Verbindung stehen könnte, aber ich bin mir nicht sicher.
Dies ist der Code, der die PDF-Dateien in ein Verzeichnis erzeugt, die dann nach der Erzeugung geteert:
function generateFile(id, path, token) {
var dirPath = path + token;
var filePath = path + token + "/file" + id + ".pdf";
console.log("creating file for: " + id);
try{
fs.statSync(dirPath).isDirectory();
} catch (err) {
fs.mkdirSync(dirPath);
}
// start the file pdf generation
file = new PDFDocument();
output = fs.createWriteStream(filePath);
output.on('close', function(){
return;
});
file.pipe(output);
// handle the intricacies of the file generation
file.text("file" + id + ".pdf");
// end the file
file.end();
}
1. Ja, die PDFs sind in ihren ursprünglichen Ordnern auf dem Server intakt, so dass sie definitiv korrekt generiert werden. 2. Ich denke, dass dies auf dem richtigen Weg ist ... Ich werde versuchen, dafür Versprechungen zu verwenden. 3.Danke für das Beispiel :) – Kw3si
Also, nachdem ich Ihren Vorschlag von Versprechungen umgesetzt hatte, war ich in der Lage, es zu einem Punkt zu bringen, wo es die PDFs richtig erzeugt, wenn es nur eins zu einer Zeit erzeugt. Untersuchung ... wird zu dir zurückgehen – Kw3si