Frage

Das Seltsame an diesem Problem ist, dass ich ein funktionierendes Beispiel hatte (wenn auch ohne Daten, die nach dem Handshake übertragen wurden), bevor ich von meinem Schreibtisch weggegangen bin, und jetzt kann ich das nicht ordnungsgemäß funktionieren, obwohl ich die wenigen Minderjährigen zurückkehrte Änderungen, die ich vorgenommen habe.

Ich verwende NodeJS + das HTTP-Proxy-Modul zu Proxy-Anforderungen für .html-Dateien zu Apache, und alle anderen Anforderungen werden von NodeJS verarbeitet.

Hier ist mein Server.js -Code:

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();

Und die Client -Seite JS:

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

Bitte beachten Sie, dass dieser Code im Moment etwas unordentlich ist wie in sehr frühen Produktionsphasen. Fühlen Sie sich jedoch frei, es zu kritisieren, wenn Sie möchten, wenn Sie denken, dass es etwas gibt, das ich auf andere Weise tun könnte/sollte.

Hier ist die Fehlermeldung, die ich erhalte, wenn ich versuche, auf eine .html -Seite zuzugreifen:

/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)

Nach dem, was ich gelesen habe, sieht es so aus, als ob die Daten gepuffert und nicht gestreamt werden, aber ich habe keine Ahnung, wie ich dies beheben kann, da ich sehr neu in der API bin (dies ist mein erstes NodeJS -Projekt).

Jede Hilfe wäre geschätzt, da ich seit einiger Zeit meinen Kopf gegen eine Mauer mit dieser Mauer geschlagen habe.

War es hilfreich?

Lösung

Hmm, es scheint, dass einige der Argumente, die in die CreateServer -Methode übergeben wurden, fremd waren - ich habe das Problem mit Folgendem behoben:

var server = httpProxy.createServer(proxyRequests);

Ich bin mir nicht ganz sicher, warum dies funktioniert hat und warum mein vorheriges Beispiel nicht mehr funktioniert, nachdem ich ursprünglich richtig gelaufen war.

Andere Tipps

Ich denke, Sie erleben dieses Problem:https://github.com/joyent/node/issues/1956

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top