0
私はファイルとjsonデータの投稿要求を受信するサービスを持っています。私はbody-parserパッケージをapp.jsのどちらかで使用していますファイルを "ファイラー"サービスに送信し、その応答を処理したいが、私はjsonコンテンツも処理し、ファイラーが応答した後にいくつかのアクションを行う必要があるため、要求をパイプしたくない。受信したファイルを保存せずに送信し、エクスプレスjsとバスボーイでパイプします
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);
}
ファイラーのサービスを以下:
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);
});
生憎ファイラサービスを欠けている部分がどこにあるか、答えることはありません、と私は知りません。 file.resume()
をbusboy.on('file')
の中のいくつかの場所に貼り付けようとしましたが、手伝っていません。
ファイルをローカルに保存しないようにしていますが、この負荷は不必要です。私はファイル内で何も変更する必要がないためです。 – kree
私は、バスボーイからのストリームに関する問題がフォームデータに使用されていると信じています。 requestjsのformDataは、おそらくそれを有効なファイルストリームとして認識していません。私はこの問題を抱えていた。あなたができる唯一の他のことは、このストリームをパイプで直接要求してからクローズイベントコールバックにすることです。 –