powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / nodejs http.Server вложенные асинхронные обращения
9 сообщений из 9, страница 1 из 1
nodejs http.Server вложенные асинхронные обращения
    #38535831
serper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код:
Код: 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
nodejs http.Server вложенные асинхронные обращения
    #38535866
Фотография Яростный Меч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
serper,

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

а эти данные из БД, которые для proxy - они общие для всех пользователей? если да, то сначала получаешь их, потом создаешь сервер (http.createServer).
Нет, для каждого соединения эти данные свои.
Сейчас есть идея сделать обертку для всех действий httpClient в данном коде, которой будут обращаться также как сейчас к переменной proxy_request, а эта оббёртка будет уже в себе буфферизировать данные и выполнять вложенные асинхронные запросы отдавая данные из буфера.
Интересно будет ли работать данная схема?
...
Рейтинг: 0 / 0
nodejs http.Server вложенные асинхронные обращения
    #38535877
Фотография Яростный Меч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
serperНет, для каждого соединения эти данные свои.откуда берутся данные для запроса к БД?
они есть в request.headers?
...
Рейтинг: 0 / 0
nodejs http.Server вложенные асинхронные обращения
    #38535917
serper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Яростный МечserperНет, для каждого соединения эти данные свои.откуда берутся данные для запроса к БД?
они есть в request.headers?
Да. Единственное, что необходимо для запроса к БД это request.headers['host'].
...
Рейтинг: 0 / 0
nodejs http.Server вложенные асинхронные обращения
    #38535947
Фотография Яростный Меч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
nodejs http.Server вложенные асинхронные обращения
    #38535958
serper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Яростный Меч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
nodejs http.Server вложенные асинхронные обращения
    #38535975
http.createClient - deprecated, используйте http.request
...
Рейтинг: 0 / 0
nodejs http.Server вложенные асинхронные обращения
    #38537996
sp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
serper,

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


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