Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / nodejs http.Server вложенные асинхронные обращения / 9 сообщений из 9, страница 1 из 1
23.01.2014, 17:11
    #38535831
serper
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
nodejs http.Server вложенные асинхронные обращения
Код:
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
var http = require('http');
var sys  = require('util');

http.createServer(function(request, response) {
    var proxy = http.createClient(80, request.headers['host']);
    var proxy_request = proxy.request(request.method, request.url, request.headers);

    proxy_request.addListener('response', function (proxy_response) {
        proxy_response.addListener('data', function(chunk) {
            response.write(chunk, 'binary');
        });
        proxy_response.addListener('end', function() {
            response.end();
        });
        response.writeHead(proxy_response.statusCode, proxy_response.headers);
    });
    request.addListener('data', function(chunk) {
        proxy_request.write(chunk, 'binary');
    });
    request.addListener('end', function() {
        proxy_request.end();
    });
}).listen(8080);



В var proxy = http.createClient(80, request.headers['host']); должны передаваться данные для соединения с прокси из БД, обращение к БД асинхронное, как лучше его организовать что-бы не поломать архитектуру и работоспособность?
Грубо говоря, как можно завернуть, допустим в setTimeout, часть использующую crateClient, что-бы данный код работал?
Как не пробовал - перестаёт работать и не возвращает результат.
...
Рейтинг: 0 / 0
23.01.2014, 17:34
    #38535866
Яростный Меч
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
nodejs http.Server вложенные асинхронные обращения
serper,

а эти данные из БД, которые для proxy - они общие для всех пользователей? если да, то сначала получаешь их, потом создаешь сервер (http.createServer).
...
Рейтинг: 0 / 0
23.01.2014, 17:41
    #38535873
serper
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
nodejs http.Server вложенные асинхронные обращения
Яростный Мечserper,

а эти данные из БД, которые для proxy - они общие для всех пользователей? если да, то сначала получаешь их, потом создаешь сервер (http.createServer).
Нет, для каждого соединения эти данные свои.
Сейчас есть идея сделать обертку для всех действий httpClient в данном коде, которой будут обращаться также как сейчас к переменной proxy_request, а эта оббёртка будет уже в себе буфферизировать данные и выполнять вложенные асинхронные запросы отдавая данные из буфера.
Интересно будет ли работать данная схема?
...
Рейтинг: 0 / 0
23.01.2014, 17:44
    #38535877
Яростный Меч
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
nodejs http.Server вложенные асинхронные обращения
serperНет, для каждого соединения эти данные свои.откуда берутся данные для запроса к БД?
они есть в request.headers?
...
Рейтинг: 0 / 0
23.01.2014, 18:10
    #38535917
serper
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
nodejs http.Server вложенные асинхронные обращения
Яростный МечserperНет, для каждого соединения эти данные свои.откуда берутся данные для запроса к БД?
они есть в request.headers?
Да. Единственное, что необходимо для запроса к БД это request.headers['host'].
...
Рейтинг: 0 / 0
23.01.2014, 18:33
    #38535947
Яростный Меч
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
nodejs http.Server вложенные асинхронные обращения
serperЯростный Мечпропущено...
откуда берутся данные для запроса к БД?
они есть в request.headers?
Да. Единственное, что необходимо для запроса к БД это request.headers['host'].тогда примерно такой набросок:
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
var http = require('http');
var sys  = require('util');

var buffer = ...; // некий буфер для данных, детали придумай сам

http.createServer(function(request, response) {
    var proxy_request = null, 
        reqEnd = false;
    getProxyDataFromDB(request.headers, function(data) {
        var proxy = http.createClient(data.port, data.host);
        proxy_request = proxy.request(request.method, request.url, request.headers);
        proxy_request.addListener('response', function (proxy_response) {
            proxy_response.addListener('data', function(chunk) {
                response.write(chunk, 'binary');
            });
            proxy_response.addListener('end', function() {
                response.end();
            });
            response.writeHead(proxy_response.statusCode, proxy_response.headers);
        });
        proxy_request.write(buffer.getAllData(), 'binary');
        if (reqEnd) { proxy_request.end(); }
    });

    request.addListener('data', function(chunk) {
        if (proxy_request) {
            proxy_request.write(chunk, 'binary');
        } else {
            buffer.add(chunk);
        }
    });
    request.addListener('end', function() {
        if (proxy_request) {
            proxy_request.end();
        } else {
            reqEnd = true;
        }
    });
}).listen(8080);



сначала отправляешь запрос в БД (getProxyDataFromDB), по факту выполнения он создает proxy_request.

параллельно берутся данные из request. пока нет proxy_request, они накапливаются в буфере (buffer.add), иначе идут прямо в proxy_request, то же самое с end() - либо вызывается proxy_request.end();, либо ставится флаг, что входные данные получены.

proxy_request при своем создании пишет в себя данные, которые успели накопиться (возможно, пустые), и если есть флаг об окончании приема входных данных, вызывает proxy_request.end();

вроде должно работать :)
...
Рейтинг: 0 / 0
23.01.2014, 18:38
    #38535958
serper
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
nodejs http.Server вложенные асинхронные обращения
Яростный Мечserperпропущено...

Да. Единственное, что необходимо для запроса к БД это request.headers['host'].тогда примерно такой набросок:
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
var http = require('http');
var sys  = require('util');

var buffer = ...; // некий буфер для данных, детали придумай сам

http.createServer(function(request, response) {
    var proxy_request = null, 
        reqEnd = false;
    getProxyDataFromDB(request.headers, function(data) {
        var proxy = http.createClient(data.port, data.host);
        proxy_request = proxy.request(request.method, request.url, request.headers);
        proxy_request.addListener('response', function (proxy_response) {
            proxy_response.addListener('data', function(chunk) {
                response.write(chunk, 'binary');
            });
            proxy_response.addListener('end', function() {
                response.end();
            });
            response.writeHead(proxy_response.statusCode, proxy_response.headers);
        });
        proxy_request.write(buffer.getAllData(), 'binary');
        if (reqEnd) { proxy_request.end(); }
    });

    request.addListener('data', function(chunk) {
        if (proxy_request) {
            proxy_request.write(chunk, 'binary');
        } else {
            buffer.add(chunk);
        }
    });
    request.addListener('end', function() {
        if (proxy_request) {
            proxy_request.end();
        } else {
            reqEnd = true;
        }
    });
}).listen(8080);



сначала отправляешь запрос в БД (getProxyDataFromDB), по факту выполнения он создает proxy_request.

параллельно берутся данные из request. пока нет proxy_request, они накапливаются в буфере (buffer.add), иначе идут прямо в proxy_request, то же самое с end() - либо вызывается proxy_request.end();, либо ставится флаг, что входные данные получены.

proxy_request при своем создании пишет в себя данные, которые успели накопиться (возможно, пустые), и если есть флаг об окончании приема входных данных, вызывает proxy_request.end();

вроде должно работать :)
Спасибо, буду пробовать. О таком подходе и думал как-раз, только реализацию работы через объект-оббертку сделать, что-бы работа выглядела примерно так-же как с http.Client.
...
Рейтинг: 0 / 0
23.01.2014, 18:55
    #38535975
nodejs http.Server вложенные асинхронные обращения
http.createClient - deprecated, используйте http.request
...
Рейтинг: 0 / 0
26.01.2014, 04:12
    #38537996
sp
sp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
nodejs http.Server вложенные асинхронные обращения
serper,

Инфо: Внизу под этим форумом есть подфорум по Node.js
...
Рейтинг: 0 / 0
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / nodejs http.Server вложенные асинхронные обращения / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]