Hapi.js代理 – 在回复之前更改回复

我试图testingHapi.js我正在处理一个新的项目我的目标是在我的Hapi服务器上触发一个请求,这个请求将触发远程服务器上使用Hapi代理的另一个请求,响应将只来自远程响应的特定属性

为了testing这个请求/ api / type3 / name,必须调用API调用GitHub的API来获取用户对象

码:

server.route({ method: 'GET', path: '/api/type3/{name}', handler: { proxy: { mapUri: function(request,callback){ callback(null,'https://api.github.com/users/'+request.params.name); }, onResponse: function(err, res, request, reply, settings, ttl){ console.log(res); reply(res); }, passThrough: true, xforward: true } } }); 

上面代码的响应是来自GitHub的响应对象现在我需要保存这个响应,所以我可以操纵它,只返回我需要的

但是,当我debugging响应对象,它包含了大量的数据,我无法find它内的响应有效载荷

那么如何只从响应对象中提取GitHub的响应呢?

非常感谢

在上面的沉船案例中,你可以这样做

payload = payload.toString();

将缓冲区转换为实际数据。

res对象是一个http.IncomingMessage 。 如果你想使用响应的主体,你需要首先读取所有的数据。

你有两个select做这个。

1)香草节点

 onResponse: function(err, res, request, reply, settings, ttl){ var body = ''; res.on('data', function (chunk) { body += chunk; }); res.on('end', function () { console.log(body); reply(body); }); } 

2)使用Wreck(哈比族人使用的一个模块来处理Node中的HTTP)

 var Wreck = require('wreck'); onResponse: function(err, res, request, reply, settings, ttl){ Wreck.read(res, null, function (err, payload) { console.log(payload); reply(payload); }); } 

我想从远程服务器加载XML数据,并将响应转换为JSON。 这个线程帮助我find了解决scheme,为我工作。 但在我的情况下,上面的代码不起作用,因为从远程服务器的响应是gzipped。 在我的控制台里只有不可读的数据。

我试图启用代理自动有效负载分析,但它不成功。 最后,我不得不用“zlib”来解压自己的回复。

此代码正在为我工​​作:

 'use strict' const url = require('url') const h2o2 = require('h2o2') const Hapi = require('hapi') const parseString = require('xml2js').parseString var zlib = require('zlib') const _ = require('lodash') var remoteServerUrl = 'http://some-url.com:2434' var originUrl = 'http://localhost:3000' // Create a server with a host and port const server = new Hapi.Server() server.connection({ host: 'localhost', port: 3001, routes: { cors: { origin: [originUrl], }, }, }) server.register({ register: h2o2, }, function (err) { server.start(function (err) { console.log('Proxy Server started at: ' + server.info.uri) }) }) server.route({ method: '*', path: '/proxy/{path*}', config: { payload: { // parse: true, // didn't worked for me // parse: 'gzip', // didn't worked for me output: 'stream', }, }, handler: { proxy: { passThrough: true, timeout: 15000, acceptEncoding: false, mapUri (request, callback) { callback(null, url.format({ protocol: url.parse(remoteServerUrl).protocol, host: url.parse(remoteServerUrl).host, port: url.parse(remoteServerUrl).port, pathname: request.params.path, query: request.query, })) }, onResponse (err, res, request, reply, settings, ttl) { if (err) { console.error('Hapi server error: ', err) } // let's unzip the response var gunzip = zlib.createGunzip() var xmlStr = '' gunzip.on('data', function (data) { xmlStr += data.toString() }) gunzip.on('end', function () { // do something with the string // in this case convert xml to json string parseString(xmlStr, {}, function (err, result) { // send result back reply(result) }) }) res.pipe(gunzip) }, }, }, }) 

也许这有助于别人;)