2017-05-15 31 views
1

我需要異步修改請求主體。東西沿線:node 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) - alternativley到'proxyWait ''''''''''''''''''''''''可以使用你自己的回調函數在準備就緒時返回通信信息(e..g'new Promise(...)。then(proxyReq.emit('doneProxy'))'然後等待這個事件返回在原始源代碼中,但這意味着你必須有一個'proxyReq.on('doneProxy',()=> //其餘的代碼)'註冊'proxyReq'事件的實際發射之前,如果這是有道理的 - 我很確定這不是最好的主意:P –