2017-09-27 2 views
0

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.

Antwort

0

Es ist wahrscheinlich, weil der Datei-Stream von Busboy nie ordnungsgemäß auf Anfrage FormData verarbeitet wird.

Ein anderer Weg ist:

  1. vorübergehend den Strom in einer lokalen Datei in Hauptdienst schreiben (mit fs.createWriteStream)
  2. erstellen Strom aus dieser Datei und eine Pipe Dienst Filer (mit fs.createReadStream)..
  3. Tun Sie, was Sie im Hauptservice tun müssen.
  4. Warten auf eine Antwort von Filer Service und rufen next()

Auf diese Weise können auch die Datei im Haupt Dienst verwenden können, wenn Sie oder die Datei an einen anderen Dienst senden müssen.

+0

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

+0

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. –

Verwandte Themen