2013-07-07 11 views
7

Io uso request di implementare il seguente proxy inverso per CouchDB in veloce:proxy inverso per CouchDB si blocca su POST e mettere in Node.js

app.all(/^\/db(.*)$/, function(req, res){ 
    var db_url = "http://localhost:5984/db" + req.params[0]; 
    req.pipe(request({ 
    uri: db_url, 
    method: req.method 
    })).pipe(res); 
}); 

Quando si effettuano richieste GET, funziona: le richieste vanno dal client to node.js a CouchDB e viceversa. Le richieste POST e PUT si bloccano indefinitamente. Le istruzioni del registro vengono eseguite fino al proxy, ma CouchDB non indica la ricezione della richiesta. Perché sta succedendo questo, e come può essere risolto?

risposta

7

Express' bodyparser middleware modifica la richiesta in un modo che fa sì che le tubazioni da appendere. Non sei sicuro del perché, ma puoi sistemarlo rendendo il tuo proxy nel middleware che cattura prima del bodyparser. In questo modo:

// wherever your db lives 
var DATABASE_URL = 'http://localhost:5984/db'; 

// middleware itself, preceding any parsers 
app.use(function(req, res, next){ 
    var proxy_path = req.path.match(/^\/db(.*)$/); 
    if(proxy_path){ 
    var db_url = DATABASE_URL + proxy_path[1]; 
    req.pipe(request({ 
     uri: db_url, 
     method: req.method 
    })).pipe(res); 
    } else { 
    next(); 
    } 
}); 
// these blokes mess with the request 
app.use(express.bodyParser()); 
app.use(express.cookieParser()); 
1

La richiesta consente di ricevere richieste per impostazione predefinita. Devi impostare il metodo.

app.all(/^\/db(.*)$/, function(req, res){ 
    var db_url = ["http://localhost:5984/db", req.params[0]].join('/'); 
    req.pipe(request({ 
    url: db_url, 
    method: url.method 
    })).pipe(res); 
}); 

(codice non testato, fammi sapere se non funziona, ma dovrebbe essere vicino)

+0

Sì, l'ho provato; non buono. Aggiornato il codice di esempio per indicarlo. – garbados