Node.js: конвертация buffer в строку
Делал proxy на Node.js.
Некоторые типы ответов сервера мне нужно было парсить и подменять небольшие кусочки.
Создаю всё функцией
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
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. Достаточно всего лишь:
1 2 3 4 5 6 7 8 9 10 11 |
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
Similar Posts
LEAVE A COMMENT
Для отправки комментария вам необходимо авторизоваться.