2015-04-14 6 views
9

Я также разместил это to the relevant issue on http-proxy.Узел зависает при запросе POST при использовании http-proxy и body-parser с выражением

Я использую http-proxy с express, поэтому я могу перехватывать запросы между моим клиентом и api, чтобы добавить некоторые файлы cookie для аутентификации.

Для аутентификации клиент должен отправить запрос POST с x-www-form-urlencoded в качестве типа содержимого. Поэтому я использую связующее ПО body-parser, чтобы проанализировать тело запроса, чтобы я мог вставлять данные в запрос.

http-proxy есть проблема с использованием body-parser, предположительно потому, что он анализирует тело как поток и никогда не закрывает его, поэтому прокси никогда не завершает запрос.

There is a solution in the http-proxy examples, который «повторно передает» запрос после его обработки, который я пытался использовать. Я также пытался использовать connect-restreamer solution in the same issue без везения.

Мой код выглядит следующим образом

var express = require('express'), 
    bodyParser = require('body-parser'), 
    httpProxy = require('http-proxy'); 

var proxy = httpProxy.createProxyServer({changeOrigin: true}); 
var restreamer = function(){ 
    return function (req, res, next) { //restreame 
    req.removeAllListeners('data') 
    req.removeAllListeners('end') 
    next() 
    process.nextTick(function() { 
     if(req.body) { 
     req.emit('data', req.body) //error gets thrown here 
     } 
     req.emit('end') 
    }) 
    } 
} 

var app = express(); 

app.use(bodyParser.urlencoded({extended: false, type: 'application/x-www-form-urlencoded'})); 
app.use(restreamer()); 

app.all("/api/*", function(req, res) { 
    //modifying req.body here 
    // 
    proxy.web(req, res, { target: 'http://urlToServer'}); 
}); 

app.listen(8080); 

и я получаю эту ошибку

/Code/project/node_modules/http-proxy/lib/http-proxy/index.js:119 
throw err; 
    ^
Error: write after end 
    at ClientRequest.OutgoingMessage.write (_http_outgoing.js:413:15) 
    at IncomingMessage.ondata (_stream_readable.js:540:20) 
    at IncomingMessage.emit (events.js:107:17) 
    at /Code/project/lib/server.js:46:25 
    at process._tickCallback (node.js:355:11) 

Я пытался отладить поток, но я схватив за соломинку. Любые предложения, пожалуйста?

+0

Просто интересно, почему вы не просто использовать экспресс-промежуточное программное обеспечение вместо HTTP-прокси? Вы можете перехватывать/изменять все запросы с помощью промежуточного программного обеспечения. – jfriend00

ответ

-1

http-proxy, как известно, плохо при работе с POST-корпусами, особенно в последних версиях Узла; и хакеры промежуточного программного обеспечения не всегда работают со всеми запросами POST. Я предлагаю вам использовать выделенный HTTP-прокси-движок, такой как NGINX или HAPROXY, которые работают лучше всего.

2

Я столкнулся с этой проблемой, и я не смог переизбыть на работу. Вот решение, в которое я пришел, хотя и грубый, и может быть неприемлемым для вашего проекта.

Я закончил перемещение промежуточного программного обеспечения body-parser на сам маршрут и не стал промежуточным программным обеспечением маршрута, так как у моего проекта было только несколько маршрутов, и сброс проходил через мое промежуточное ПО-прокси-сервер.

так вместо этого:

router.use(bodyParser.json()); 

router.get('/', function(){...}); 

router.use(httpProxy()); 

Я сделал это:

router.get('/', bodyParser.json(), function(){...}) 

router.use(httpProxy()) 

 Смежные вопросы

  • Нет связанных вопросов^_^