2012-01-10 8 views
-1

この問題の奇妙なことは、私が机から離れてしまう前に、実例があることです。私が作ったわずかなマイナーな変更を元に戻したにもかかわらず、これが正しく機能しているようには見えません。NodeJS + http-proxy - オブジェクトにメソッド 'resume'がありません

私はApacheに.htmlファイルのリクエストをプロキシするためにNodeJS + http-proxyモジュールを使用しています。その他のリクエストはNodeJSで処理されています。ここで

は私server.jsコードです:

CometServer = (function() { 

    var instance; 

    function __construct() { 

    var apachePort = 3000; 
    var nodeJsPort = 3001; 
    var apacheHost = 'localhost'; 
    var nodeJsHost = 'localhost'; 
    var httpProxy = require('/root/node_modules/http-proxy'); 
    var io = require('/root/node_modules/socket.io'); 
    var fs = require('/root/node/lib/fs'); 
    var path = require('/root/node/lib/path'); 
    var url = require('/root/node/lib/url'); 
    var apacheUrls = [ 
     /.*\.html/, 
     /^\/$/ 
    ]; 

    function proxyRequests(request, response, proxy) { 

     // Check if the URL is a comet request or not. 
     var shouldProxy = apacheUrls.some(function(requestUrl) { 
     return requestUrl.test(request.url); 
     }); 

     // If 'request.url' matches any of the 'apacheUrls' then proxy to Apache. 
     if (shouldProxy) { 

     return proxy.proxyRequest(request, response, { 
      host: apacheHost, 
      port: apachePort 
     }); 

     } 

     // Not proxied to Apache; this is a comet request and should be processed by NodeJS. 
     return handleUnproxiedRequests(request, response); 

    } 

    function handleUnproxiedRequests(request, response) { 
     var uri = url.parse(request.url).pathname; 
     var filePath = path.join(process.cwd(), '..', uri); 

     var extname = path.extname(filePath); 
     var contentType = 'text/javascript'; 

     path.exists(filePath, function(exists) { 
     if (exists) { 
      var fileStream = fs.createReadStream(filePath); 
      fileStream.on('data', function (data) { 
      response.writeHead(200, { 
       'Content-Type': contentType 
      }); 
      response.write(data); 
      response.end(); 
      }); 
     } 
     else { 
      response.writeHead(404); 
      response.end(); 
     } 
     }); 
     return; 
    } 

    function bootstrap() { 

     // Create a http proxy server and use the 'proxy' conditionally inside the request handler. 
     var server = httpProxy.createServer(nodeJsPort, nodeJsHost, { 
     target: { 
      host: nodeJsHost, 
      port: nodeJsPort 
     } 
     }, proxyRequests); 

     // Get the http proxy server to listen to a port. 
     server.listen(nodeJsPort); 

     // Get socket.io to listen to the proxy server. 
     var listener = io.listen(server); 

     var something = listener.on('connection', function(socket) { 
     console.log('socket connected'); 
     socket.on('handshake', function(pid) { 
      console.log('socket? ' + pid); 
     }) 
     }); 

    } 

    // Bootstrap server. 
    bootstrap(); 

    return { } 

    } 

    return { 
    getInstance: function() { 
     // Instantiate only if the instance doesn't already exist. 
     if (!instance) { 
     instance = __construct(); 
     } 
     return instance; 
    } 
    } 
})(); 

// Initialize the comet server. 
CometServer.getInstance(); 

とクライアント側のJS:

var socket = io.connect(); 
console.log('Connected'); 
socket.on('connect', function(data) { 
    console.log('Sending handshake'); 
    socket.emit('handshake', 1); 
}); 

、それは非常に初期の段階にありますように、このコードは現時点では少し厄介であることに注意してください製造。しかし、あなたが好きであれば、私は別のやり方でやっていなければならないことがあると思うなら、自由にそれを批評してください。私は.htmlのページにアクセスしようとすると、ここで

が、私はエラーメッセージです:私は何を読んでから

/root/node_modules/http-proxy/lib/node-http-proxy/http-proxy.js:334 
     ? buffer.resume() 
     ^
TypeError: Object #<Object> has no method 'resume' 
    at [object Function].proxyRequest (/root/node_modules/http-proxy/lib/node-http-proxy/http-proxy.js:334:16) 
    at proxyRequests (/var/www/html/Comet/server.js:139:22) 
    at Server.<anonymous> (/root/node_modules/http-proxy/lib/node-http-proxy.js:321:7) 
    at Manager.handleRequest (/root/node_modules/socket.io/lib/manager.js:531:28) 
    at Server.<anonymous> (/root/node_modules/socket.io/lib/manager.js:112:10) 
    at Server.emit (events.js:70:17) 
    at HTTPParser.onIncoming (http.js:1479:12) 
    at HTTPParser.onHeadersComplete (http.js:102:31) 
    at Socket.ondata (http.js:1375:22) 
    at TCP.onread (net.js:334:27) 

を、データではなくストリーミングよりもバッファリングされているように見えますが、私はしないでください私はAPIの初心者です(これは私の最初のNodeJSプロジェクトです)。

私はかなり長い間、これでレンガの壁に頭を打っていたので、助けていただければ幸いです。

+0

私も故意proxyRequestにバッファを渡して試してみた:以下のように: VARバッファ= httpProxy.buffer(リクエスト)。 return proxy.proxyRequest(リクエスト、レスポンス、{ ポート:apachePort、 ホスト:apacheHost、 バッファ:バッファ }); 残念ながら、私はまだ同じ結果に終わります。 – GMemory

答えて

1

うーん、それはcreateServerメソッドに渡された引数の一部が余分だったようです - 私は、次のように問題を修正:

var server = httpProxy.createServer(proxyRequests); 

私はなぜこれが働い完全にわからないんだけど、なぜ私の前元々正常に動作した後で動作を停止する例

関連する問題