Nodejs + http -proxy - объект не имеет метода «резюме»
-
26-10-2019 - |
Вопрос
Странная вещь в этой проблеме заключается в том, что у меня был рабочий пример (хотя и без данных, передаваемых после хранения), прежде чем я ушел из своего стола, и теперь я не могу получить это работать должным образом, несмотря на то, что он вернул немногих несовершеннолетних Изменения, которые я сделал.
Я использую 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