关于这个问题的奇怪之处在于,我有一个工作示例(尽管没有数据被转移后弹药),然后才离开桌子,现在我似乎无法正常工作,尽管恢复了几个未成年人我做出的更改。

我正在使用nodejs + HTTP-Proxy模块来代理.html文件到Apache的请求,并且所有其他请求都由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项目)。

任何帮助都将不胜感激,因为我已经用砖墙撞了一段时间了。

有帮助吗?

解决方案

嗯,看来某些传递到Createserver方法的论点是无关的 - 我用以下内容解决了问题:

var server = httpProxy.createServer(proxyRequests);

我不确定为什么这起作用,以及为什么我以前的示例最初正确运行后停止工作。

其他提示

我认为您正在遇到这个问题:https://github.com/joyent/node/issues/1956

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top