2017-08-17 1 views
2

Ich bin Neuling zu expressjs, Hier ist meine App js: Wenn ich die Res.Send ie Aman in der nächsten Middleware entfernen wird das Bild heruntergeladen aber wenn ich das einschließe, wird das Bild nicht heruntergeladen. Ich bin verwirrt, ich meine Middleware führt eins nach dem anderen aus, eines wird dann ausgeführt, das nächste() wird evozieren und dann das nächste, aber hier ist es nicht so, warum ist es so? Kann jemand diese res.sendFile()Warum Bild nicht rendert, wenn ich eine res.send in nächste Middleware-Funktion einschließe

var express = require('express'); 
    var app = express(); 

    app.get('/', function(req, res) { 
     res.send("Default"); 
    }); 

    var Aperson = function(req, res, next) { 
     console.log("File is downloaing"); 
     res.download(__dirname + '/instagram_5.jpg'); 
     next(); 
    } 
    app.get("/download", [Aperson], function(req, res) { 
     res.send("AMan"); 
    }); 
    app.use(function(req, res) { 
     res.status(404).send("Sorry cant find that"); 
    }); 

    app.listen(4000, function() { 
     console.log("App started on port 4000"); 
    }); 

Antwort

1

Da res.download(__dirname + '/instagram_5.jpg') dienen soll async Prozess der next() ausgeführt wird, während die res.download wird im Hintergrund arbeiten.

So müssen Sie nicht einmal res.send() und next() anrufen, weil nach res.download() beendet wird es automatisch auf den Client reagieren.

+0

bas whi toh baat hai. Wenn ich diese res.download() - Funktion ausführe ist es egal, ob ich eine nächste Funktion geschrieben habe oder nicht, sie sollte in derselben Zeile enden. Aber warum geht es immer noch zum nächsten Controller, wenn ich diesen "res.send (" AMan ") schreibe;" Wenn diese Zeile entfernt wird, wird das Bild tatsächlich ohne Probleme heruntergeladen. @ajit jain –

+0

es wird gehen, weil 'next()' Anweisung ausgeführt und Ihr Code in der nächsten Funktion eintritt, während res.download() noch in der Warteschlange warten, um es auszuführen Callback nach der Ausführung 'res.send()' Ereignisschleife wird Callback verarbeiten von 'res.download', das res.send erzeugt' AMan' auf dem Bildschirm und schließen Antwort-Stream .. Sie sollten folgende Zeilen in Ihrem Code hinzufügen und dann beobachten Verhalten in der Konsole: verwenden Sie diese –

+0

'res.Download (__Dirname + '/ instagram_5.jpg‘, (err) => { console.log ("Async-Funktion"); });' statt 'res.download (__ dirname + '/instagram_5.jpg')' 2. Verwendung 'console.log (" Alles ")' in 'app.get ("/download ", [Person], Funktion (req, res)) { res. sende ("AMan"); }); vor 'res.send()' @Eddysapata –

0

Verwenden mir erklären, eine Datei von öffentlichen Ordner

/* Public static directory */ 
app.use(express.static(__dirname + '/public')); 
/* Serve image for example inside the assets folder*/ 
app.get('/download', function(req, res){  
     res.sendFile('/assets/image.png');  
}); 
0
var express = require('express'); 
var app = express(); 
/* Public directory */ 
app.use("/images", express.static(__dirname + '/public/images')); 
app.get('/', function(req, res) { 
    res.send("Default"); 
}); 

var Aperson = function(req, res, next) { 
    console.log("File is downloaing"); 
    res.download(__dirname + '/instagram_5.jpg'); 
    next(); 
} 
app.get('/download', function(req, res, err){ 
    if (err) { 
    return res.send(); 
    } 
    var file = __dirname + '/images/image.png'; //here comes your path 
    var filename = path.basename(file); 
    var mimetype = mime.lookup(file); 
    res.setHeader('Content-disposition', 'attachment; filename=' + filename); 
    res.setHeader('Content-type', mimetype); 
    var filestream = fs.createReadStream(file); 
    filestream.pipe(res); 
}); 

app.use(function(req, res) { 
    res.status(404).send("Sorry cant find that"); 
}); 

app.listen(4000, function() { 
    console.log("App started on port 4000"); 
}); 
+0

Fehler: Kann Header nicht festlegen, nachdem sie gesendet werden. –

+0

bedeutet, dass Sie Fehler bekommen! Sie müssen den Fehler zurückgeben, ich werde den Code aktualisieren/ –

+0

_http_outgoing.js: 356 werfen neuen Fehler ('Kann Header nicht festlegen, nachdem sie gesendet werden.'); ^ –

Verwandte Themen