Node.js: конвертация buffer в строку

Делал proxy на Node.js.
Некоторые типы ответов сервера мне нужно было парсить и подменять небольшие кусочки.
Создаю всё функцией

function makeProxy(req, res, cb)
{
	delete req.headers.host;
	delete req.headers['accept-encoding']; // to prevent gzipping data on api server
	var options = {
			hostname: apiHost,
			port: 80,
			path: req.url,
			method: req.method,
			headers: req.headers
		},
		proxy = http.request(options, cb || noop);

	proxy.on('response', function (proxyResponse) {
		fixCookies(proxyResponse.headers, apiHost);
		res.writeHead(proxyResponse.statusCode, proxyResponse.headers);
	});

	return proxy;
}

Но тело ответа всегда приходит буфером.
Много всякого читал, как вместо буферов принимать строки, пытался через промежуточный поток типа transform всё сделать (http://nodejs.org/api/stream.html#stream_class_stream_transform_1), но ничего не получалось.

А потом случайно наткнулся на пост http://stackoverflow.com/questions/12121775/convert-buffer-to-utf8-string#comment31200460_12122668. Достаточно всего лишь:

var proxy = makeProxy(req, res);               
                                               
proxy.on('response', function (proxyResponse) {
	var responseBody = '';                            
	proxyResponse.on('data', function (chunk) {   
		responseBody += chunk.toString('utf8');                               
	});                                           
	proxyResponse.on('end', function () {                      
		res.end(responseBody);                           
	});                                           
});

О чём ещё стоит не забыть — нужно запретить сжатие на сервере (delete req.headers[‘accept-encoding’]) или разжимать на ноде.
Ну и напоследок хорошая большая статья про потоки в node.js 0.10+: https://github.com/substack/stream-handbook/blob/master/readme.markdown

LEAVE A COMMENT