2017-05-15 13 views
1

要求本体を非同期に変更する必要があります。ノードhttp-proxy:要求本体の非同期変更

proxy.on('proxyReq', function(proxyReq, req, res, options) { 
    if(req.body) { 
    new Promise(function(resolve){ 
     setTimeout(function() { // wait for the db to return 
     'use strict'; 
     req.body.text += 'test'; 
     let bodyData = JSON.stringify(req.body); 
     proxyReq.setHeader('Content-Type','application/json'); 
     proxyReq.setHeader('Content-Length', Buffer.byteLength(bodyData)); 
     // stream the content 
     proxyReq.write(bodyData); 
     resolve(); 
     },1); 
    }); 
    } 
}); 

これを実行すると、設定された後にはmodfiyヘッダーを作成できないというエラーが表示されます。どちらが理にかなっている。

準備が整うまで、リクエストの送信を停止するにはどうすればよいですか? proxyReqからさまざまなリスナーを削除してみました。

+0

この試してみてください。https://github.com/nodejitsu/node-http-proxy#setup-a-stand-alone-proxy-server-with-latency –

答えて

1

source code @ - )を見ると、proxyReqイベントが送信され、コードが移動するため実際にはそうではないようです。

もしそれが約束を待っていたら、(その約束を返せば)可能かもしれません。このLIBの

最小限のフォークは、例えば次のようになります。

// Enable developers to modify the proxyReq before headers are sent 
proxyReq.on('socket', function(socket) { 
    if(server) { server.emit('proxyReq', proxyReq, req, res, options); } 
}); 

(proxyReq.proxyWait || Promise.resolve()) 
    .then(... // rest of the code inside the callback 

そして

proxy.on('proxyReq', function(proxyReq, req, res, options) { 
    if(req.body) { 
    proxyReq.proxyWait = new Promise(function(resolve){ 
     setTimeout(function() { ... 

しかし、あなたのユースケースに応じて、同様に他の解決策があるかもしれません。たとえば、このプロキシライブラリを使用することが本当に必要かどうかを検討してください。代わりに、httpを直接使用することもできます。ここでは、イベントとコールバックに関するすべての制御があります。

+0

私はしばらくソースを掘り下げています:)私はあなたの提案がうまくいくとは思わない、私はserver.emit( 'proxyReq' ..それ自体が非同期であることを理解しているので、コードが渡されるときproxyWaitは存在しないだろう(proxyReq.proxyWait || Promise.resolve()) – AyKarsi

+0

えーと、nodejsと同じ/同様のものを発行していません。[同期しています](https://nodejs.org/api/events.html#events_emitter_emit_eventname_args) - 'proxyWait 'あなたが自分のemitをコールバックから使用して準備ができたら(e.g' new Promise(...)。then(proxyReq.emit( 'doneProxy')) '通信し、このイベントを待つそれは元のソースコードでは、 'proxyReq.on( 'doneProxy'、()=> //残りのコード) 'が実際に' proxyReq'イベントを実際に送出する前に登録されていれば、それは意味があります - 私はこれが最良の考えではないと確信しています:P –

関連する問題