Странная вещь в этой проблеме заключается в том, что у меня был рабочий пример (хотя данные не передавались после рукопожатия) до того, как я ушел со своего стола, и теперь я не могу заставить его работать должным образом, несмотря на возвращение несколько небольших изменений, которые я сделал.
Я использую 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 ).
Буду признателен за любую помощь, так как я уже довольно давно бьюсь головой об кирпичную стену.