0

ファイルのアップロードにプロキシを使用するためのノード サーバーを作成しようとしています。

このサーバーの主な役割は、クライアント エンド プロキシから OpenStack Swift サーバーに HTTP PUT 要求を取得することです。

ソースコードは次のようになります。

var https = require('https')
   // ... some modules are required
   , Swift = reuiqre('swift')
   , mysql = require('mysql');

// some configurations

function request(options, callback, pipe){
  var client = https.request(options, function(res){
    res.on('end', function(err){
      // something to do
    });
  });

  pipe.req.on('data', function(chunk){
    client.write(buffer);
  });

  pipe.req.on('end', function(err){
    client.end();
    callback(null, res);
  });
}

app.put('/upload', function(req, res, next){
  var swift = new Swift(swiftConfig, function(err, result) {
    var options = some logics for options here;
    db.query('SELECT * FROM SOMETABLE WHERE SOMETHING = ?'
          , [something]
          , function (err, results) {
              if (err) return next(err);
              request.call(swift, options, function(err, result) {
                if(err) { res.send(500, err) };
                res.end();
              }, {req: req});
    });
  });
}

上記のコードは、クライアント PC からファイルを PUT したときにうまく機能します。

ただし、 content-length がzero(0)のファイルをアップロード(HTTP PUT)すると問題が発生します。

アップロードするファイルのサイズが 1KB の場合でも、問題なく動作します。

しかし、0 バイトのファイル (空の http 本文) をアップロードしようとすると、「終了」イベント (以下のコード) が呼び出されず、最終的に要求は「エラー: ソケットがハングアップしました」というエラーを出力します。

  pipe.req.on('end', function(err){
    client.end();
    callback(null, res);
  });

誰でも私を助けることができますか?

4

1 に答える 1

0

最後に、この問題の原因を突き止めました。

リクエスト機能 (Swift ライブラリから取得) は、パイプを使用してクライアントから Swift にデータをプロキシします。

リクエスト関数を呼び出すときは、コールバック関数に含めないでください。この場合、リクエスト関数は「new Swift()」と「db.query」のコールバック関数で呼び出されます。

リクエスト ボディの content-length が 0 の場合、「request.call」が呼び出される前に、リクエストの「end」イベントが呼び出される可能性があります。

ですから、これを覚えておく必要があります。

'request.call(swift....' ステートメントを使用する場合は、コールバック関数に含めてはなりません。

于 2013-01-16T07:55:54.130 に答える