0

リクエストをインターセプトするプロキシ サーバー コードを作成しています (ユーザーがブラウザー ウィンドウのリンクをクリックすることによって発生)、そのリクエストをサード パーティのファイル サーバーに転送します。次に、私のコードは応答を取得し、それをブラウザーに転送します。ファイルの MIME タイプに基づいて、次の 2 つの方法のいずれかでファイル サーバーの応答を処理したいと考えています。

  1. ファイルが画像の場合、画像を表示する新しいページにユーザーを送りたい、または
  2. 他のすべてのファイル タイプについては、ブラウザーで受信 (通常はダウンロード) を処理するだけです。

私のノード スタックには、Express+bodyParser、Request.js、EJS、および Passport が含まれています。以下は、基本的なプロキシ コードと、多くの助けが必要な疑似コードです。(ミアカルパ!)

app.get('/file', ensureLoggedIn('/login'), function(req,res) {

var filePath = 'https://www.fileserver.com/file'+req.query.fileID,
companyID = etc…,
companyPW = etc…,
fileServerResponse = request.get(filePath).auth(companyID,companyPW,false);

    if ( fileServerResponse.get('Content-type') == 'image/png')   // I will also add other image types
            // Line above yields TypeError: Object #<Request> has no method 'get'
            // Is it because Express and Request.js aren't using compatible response object structures?
        {
        // render the image using an EJS template and insert image using base64-encoding
        res.render( 'imageTemplate', 
                { imageData: new Buffer(fileServerResponse.body).toString('base64') } 
            );
        // During render, EJS will insert data in the imageTemplate HTML using something like:
        // <img src='data:image/png;base64, <%= imageData %>' />
        }

    else    // file is not an image, so let  browser deal with receiving the data
        { 
        fileServerResponse.pipe(res); // forward entire response transparently
            // line above works perfectly and would be fine if I only wanted to provide downloads.
        }   
})

私はファイルサーバーを制御できず、ファイルには必ずしもファイルサフィックスが付いているとは限らないため、MIME タイプを取得する必要があります。このプロキシ タスクを実行するためのより良い方法 (たとえば、ファイル サーバーの応答をファイルとして一時的に保存し、それを検査する方法) があれば、私はすべて耳にします。また、それが役立つ場合は、モジュールやミドルウェアを追加する柔軟性があります。ありがとう!

4

2 に答える 2

2

インターフェイスごとに、リクエスト関数にコールバックを渡す必要があります。これは非同期であり、戻り値として fileServerResponse を返しません。

request.get({
  uri: filePath,
  'auth': {
    'user': companyId,
    'pass': companyPW,
    'sendImmediately': false
  }
}, function (error, fileServerResponse, body) {
   //note that fileServerResponse uses the node core http.IncomingMessage API
   //so the content type is in fileServerResponse.headers['content-type'] 
});
于 2013-10-30T06:12:24.150 に答える