2016-10-04 4 views
3

Ich bin ein relativer Neuling von Node.js. Zwei Tage habe ich versucht, den Hauptteil einer Anfrage in Node.js zu ändern und dann weiterzuleiten. Für das Proxying verwende ich http-proxy Modul.Modify Anfrage Körper und dann Proxying in Node.js

Ich muss das Passwort eines Benutzers in einem JSON-Objekt abfangen, es verschlüsseln und das neue verschlüsselte Passwort in den Anfragetext einfügen.

Das Problem ist, dass jedes Mal, wenn ich versuche, die Anfrage Körper sammeln ich es verbrauchen (d. H. Mit body-parser). Wie kann ich diese Aufgabe erfüllen? Ich weiß, dass die Anfrage in Knoten gesehen hat einen Stream.

Aus Gründen der Vollständigkeit verwende ich express, um mehrere Operationen vor dem Proxying zu verketten.

EDIT

Die Tatsache, dass ich an den Proxy haben die Anforderung nicht nutzlos. Es folgt dem Code, den ich versuche zu verwenden.

function encipher(req, res, next){ 
    var password = req.body.password; 
    var encryptionData = Crypto().saltHashPassword(password); 
    req.body.password = encryptionData.passwordHash; 
    req.body['salt'] = encryptionData.salt; 
    next(); 
} 

server.post("/users", bodyParser.json(), encipher, function(req, res) { 
    apiProxy.web(req, res, {target: apiUserForwardingUrl}); 
}); 

Der Server (von Spring MVC gemacht REST) ​​geben Sie mir die Ausnahme Failed to read HTTP message: org.springframework.http.converter.HttpMessageNotReadableException: Could not read document: null

Antwort

5

Das eigentliche Problem ist, dass es ein Integrationsproblem zwischen den Modulen body-parser und http-proxy gibt, wie in this Thread angegeben.

Eine Lösung besteht darin, body-parser nach http-proxy zu konfigurieren. Wenn Sie die Reihenfolge der Middleware nicht ändern können (wie in meinem Fall), können Sie restream den geparsten Körper vor dem Proxys der Anfrage.

// restream parsed body before proxying 
proxy.on('proxyReq', function(proxyReq, req, res, options) { 
    if (req.body) { 
     let bodyData = JSON.stringify(req.body); 
     // incase if content-type is application/x-www-form-urlencoded -> we need to change to application/json 
     proxyReq.setHeader('Content-Type','application/json'); 
     proxyReq.setHeader('Content-Length', Buffer.byteLength(bodyData)); 
     // stream the content 
     proxyReq.write(bodyData); 
    } 
} 

Ich habe 2 Tage auf diesem f ***** Problem verloren. Ich hoffe es hilft!

+0

Das gibt mir den Fehler "Kann Header nicht festlegen, nachdem sie gesendet werden.". Vgl. https://github.com/nodejitsu/node-http-proxy/issues/1168 und https://github.com/nodejitsu/node-http-proxy/issues/908. –

0

Warum für diese ausdrückliche Verkettungs nicht verwenden? In Ihrer ersten Funktion tut nur so etwas wie diese:

req.body.password = encrypt(req.body.password); next();

+0

Muss ich Body-Parser zuerst verketten? Weil ich bemerkt habe, dass es die Anfrage verbraucht. –

+0

Sie müssen body-parser in Ihrer Express-Konfiguration verwenden: 'app.use (bodyParser.urlencoded ({extended: true})); \t app.use (bodyParser.json()); ' –

+0

Und es verbraucht die Anfrage nicht? Wird es für die nächste Middleware verfügbar sein? –

0

Sie müssen nur eine Middleware verwenden.

body-parser ist auch nur eine Middleware, die die Anfrage Körper und stellt sie unter req.body parst

Sie können etwas tun:

app.use(bodyParser.urlencoded({ extended: true })); 
app.use(bodyParser.json()); 

function encryptPassword(req, res, next) { 
    req.body.password = encrypt(req.body.password); 
    // You can do anything really here and modify the req 

    //call next after you are done to pass on to next function 

    next(); 
} 

app.use(encryptPassword); 

Generell Menschen Middle zur Authentifizierung, rollenbasierte Zugriffskontrolle etc .....

Sie können Middlewares in bestimmten Routen auch verwenden:

app.post('/password', encryptPassword, function(req, res) { 
    // Here the req.body.password is the encrypted password.... 

    // You can do other operations related to this endpoint, like store password in database 

    return res.status(201).send("Password updated!!"); 
}); 
+0

Versuchen Sie, Ihren req.body vor dem Aufruf von apiProxy zu loggen, und geben Sie uns dieses Protokoll. –