Ich brauche eine einfache Möglichkeit zum Zugriff auf mehrteilige Formulardaten im req Objekt mit Hilfe von Busboy-Connect. Ich benutze Express 4, der jetzt Module für zuvor eingebaute Funktionen benötigt.Zugriff auf Express 4 req.body-Objekt mit Busboy
Ich möchte, dass das req.body-Objekt in meinen Routen verfügbar ist, aber die Funktion busboy.on ('Feld') asynchron ist und nicht alle Formulardaten verarbeitet, bevor es übergeben wird, um den Code weiterzuführen.
Es gibt ein Middleware-Modul, das auf dem Busboy namens multer gebaut wurde. Es ruft das Objekt req.body ab, bevor es zur Route kommt. Es überschreibt jedoch die Möglichkeit, das Ereignis busboy.on ('Datei') zu definieren Route.
Hier ist mein gebrochenen Code:
// App.js
app.post(/users, function(req, res, next){
var busboy = new Busboy({ headers: req.headers });
// handle text field data (code taken from multer.js)
busboy.on('field', function(fieldname, val, valTruncated, keyTruncated) {
if (req.body.hasOwnProperty(fieldname)) {
if (Array.isArray(req.body[fieldname])) {
req.body[fieldname].push(val);
} else {
req.body[fieldname] = [req.body[fieldname], val];
}
} else {
req.body[fieldname] = val;
console.log(req.body);
}
});
busboy.on('file', function(fieldname, file, filename, encoding, mimetype) {
tmpUploadPath = path.join(__dirname, "uploads/", filename);
targetPath = path.join(__dirname, "userpics/", filename);
self.imageName = filename;
self.imageUrl = filename;
file.pipe(fs.createWriteStream(tmpUploadPath));
});
req.pipe(busboy); // start piping the data.
console.log(req.body) // outputs nothing, evaluated before busboy.on('field')
// has completed.
});
UPDATE Ich verwende connect-busboy. Ich habe diesen Middleware-Code in meiner Express-Setup-Datei verwendet, um mir Zugriff auf das Objekt req.body innerhalb meiner Route zu geben. Ich kann den Datei-Upload auch von meiner Route aus bearbeiten und habe Zugriff auf req.busbuy.on ('end').
// busboy middleware to grab req. post data for multipart submissions.
app.use(busboy({ immediate: true }));
app.use(function(req, res, next) {
req.busboy.on('field', function(fieldname, val) {
// console.log(fieldname, val);
req.body[fieldname] = val;
});
req.busboy.on('finish', function(){
next();
});
});
ich das gleiche Problem habe Sie erklären dagegen, wie dieser Code funktioniert? Ich habe alle meine Anfragen in separaten Routen behandelt und diese Lösung funktioniert nicht für meinen Code. Vielleicht, wenn ich ein besseres Verständnis davon hätte, was Sie tun würden, würde mir das helfen, mein Problem zu lösen! Dies ist mein erstes Knotenprojekt. – Jeffpowrs
@JeffPowers Ich konnte die Middleware nicht so funktionieren lassen, wie ich gedacht hatte. Es gibt keine aktuelle Lösung, um eingehende Multipart-Daten an "verschiedenen" Speicherorten zu analysieren, z. B. nur die Felder analysieren, dann etwas mit den Felddaten tun, die Datei später analysieren und dann busboy.on ("finish") aufrufen. Bitte sehen Sie meinen Beitrag hier: http: //programmers.stackexchange.com/questions/239170/how-to-parse-multipart-field-file-data-separately lassen Sie mich wissen, wenn Sie etwas finden. Ich endete damit, eine Menge Logik in meinen Controller zu legen ... keine gute Design-Wahl, aber ich gab auf. – Scott
Ich kam zu der gleichen Schlussfolgerung, die ich tatsächlich busboy für Multer auswechselte: https://github.com/expressjs/multer. Es war viel einfacher. – Jeffpowrs