Question

La chose étrange à propos de ce problème est que j'ai eu un exemple de travail (mais sans données transférées après poignée de main) avant que je suis loin de mon bureau, et semblent maintenant je ne peux pas obtenir ce travail correctement, malgré un retour les quelques changements mineurs que j'ai fait.

J'utilise NodeJS + le module http proxy aux demandes proxy pour les fichiers .html à Apache, et toutes les autres demandes sont en cours de traitement par NodeJS.

Voici mon code 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();

Et les js côté client:

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

S'il vous plaît noter que ce code est un peu en désordre au moment car il est à un stade très précoce de la production. Cependant, ne hésitez pas à elle critique si vous voulez, si vous pensez qu'il ya quelque chose que je pourrais / devrais faire d'une manière différente.

Voici le message d'erreur que je reçois lorsque je tente d'accéder à une page .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)

D'après ce que je l'ai lu, il semble que les données sont conservées plutôt que ruisselait, mais je n'ai vraiment aucune idée comment résoudre ce problème comme je suis très nouveau à l'API (ce qui est mon premier projet NodeJS ).

Toute aide serait appréciée, comme je l'ai été cogner la tête contre un mur de briques avec cela pour un certain temps maintenant.

Était-ce utile?

La solution

Hmm, il semble que certains des arguments passés dans la méthode de createServer étaient étrangers - je résolu le problème avec ce qui suit:

var server = httpProxy.createServer(proxyRequests);

Je ne suis pas vraiment pourquoi cela a fonctionné, et pourquoi mon exemple précédent cessé de fonctionner après l'origine fonctionne correctement.

Autres conseils

Je pense que vous rencontrez ce problème: https://github.com/joyent/node/issues/1956

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top