Ich habe einen Dienst, was eine Post-Anfrage mit einer Datei und JSON-Daten zu erhalten. Ich benutze das body-parser Paket entweder in der app.js. Ich möchte die Datei an einen "Filer" -Service senden und die Antwort daraus verarbeiten, aber ich möchte die Anfrage nicht weiterleiten, da ich den JSON-Inhalt ebenfalls verarbeiten muss und einige Aktionen ausführen muss, nachdem der Filer geantwortet hat.Senden Sie eine empfangene Datei über einen Dienst, ohne es zu speichern und es mit Express js und Busboy
const Busboy = require('busboy');
const request = require('request');
const sendFile = (req, file, callback) => {
return request.post({
uri: 'http://localhost:5000/stream',
headers: req.headers,
formData: { value: file }
}, (err, resp, body) => {
if (err) return callback(err);
return callback();
});
};
app.post('/route', (req, res, next) {
const busboy = new Busboy({ headers: req.headers });
busboy.on('file', (fieldName, file) => {
file.on('error', err => reject(err));
return sendFile(req, file, (err, link) => {
file.resume();
if (err) return reject(err);
});
});
busboy.on('field', (fieldName, val) => {
// process the json here...
});
busboy.on('finish',() => {
console.log('busboy.on(finish)');
return next();
});
req.pipe(busboy);
}
Der Filer-Service des folgend:
app.post('/stream', (req, res, next) => {
const busboy = new Busboy({ headers: req.headers });
// here we are ok
busboy.on('file', function (fieldName, file, name) {
// but this part never run
res.send(200, { fileId: fileDoc._id });
});
return req.pipe(busboy);
});
Unfortunatelly des Filer-Dienst nie beantworten, und ich weiß nicht, wo ist ein fehlender Teil. Versucht, die file.resume()
an einigen Stellen innerhalb der busboy.on('file')
zu setzen, hilft aber nicht.
Ich versuche zu vermeiden, die Dateien auf lokalen zu speichern, diese Last ist nicht notwendig. Hauptsächlich weil ich nichts in der Datei ändern muss. – kree
Ich glaube, das Problem mit Stream von Busboy in Formdaten verwendet wird. formData for requestjs erkennt es wahrscheinlich nicht als gültigen Dateistream. Ich habe dieses Problem gehabt. Die einzige andere Sache, die Sie tun können, ist diesen Stream zu pipern, um direkt und dann beim Schließen des Ereignisrückrufs anzufragen. –