2017-09-27 5 views
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')の中のいくつかの場所に貼り付けようとしましたが、手伝っていません。

答えて

0

おそらく、busboyからのファイルストリームが要求formDataによって決して正しく処理されないためです。

もう一つの方法は次のとおりです。

  1. 一時的にメインサービス内のローカルファイルへのストリームを書き込む(fs.createWriteStreamを使用して)
  2. そのファイルやパイプ、それからファイラサービスへのストリームを作成します(fs.createReadStreamを使用)。
  3. メインサービスで必要な処理を行います。
  4. ファイラサービスからの応答を待つとnext()

あなたが必要とするか、または別のサービスにファイルを送信した場合、あなたも、メインのサービスでファイルを使用することができるこの方法を呼び出します。

+0

ファイルをローカルに保存しないようにしていますが、この負荷は不必要です。私はファイル内で何も変更する必要がないためです。 – kree

+0

私は、バスボーイからのストリームに関する問題がフォームデータに使用されていると信じています。 requestjsのformDataは、おそらくそれを有効なファイルストリームとして認識していません。私はこの問題を抱えていた。あなたができる唯一の他のことは、このストリームをパイプで直接要求してからクローズイベントコールバックにすることです。 –

関連する問題