修改请求主体,然后在Node.js中进行代理

时间:2016-10-04 08:01:29

标签: javascript node.js spring-mvc express proxy

我是Node.js的相对新手。我试图修改Node.js中的Request的主体然后转发它已经两天了。对于代理,我使用的是var wb = new XLWorkbook(); var wsDep = wb.Worksheets.Add("MyWorksheet"); wsDep.Columns("A").AdjustToContents(); wsDep.Columns("B1").AdjustToContents(); wsDep.Columns().AdjustToContents(); 模块。

我要做的是拦截JSON对象内用户的密码,加密它并在请求体内设置新的加密密码。

问题在于,每当我尝试收集请求主体时,我都会使用它(即使用http-proxy)。我怎样才能完成这项任务?我知道看到节点中的请求有一个流。

为了完整起见,我在代理之前使用body-parser链接多个操作。

修改

我必须代理请求这一事实并非毫无用处。它遵循我尝试使用的代码。

express

服务器(Spring MVC制作的REST)给我异常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}); });

3 个答案:

答案 0 :(得分:7)

真正的问题是模块body-parserhttp-proxy之间存在集成问题,如this主题中所述。

一种解决方案是在body-parser之后配置http-proxy。如果您无法更改中间件的顺序(在我的情况下),您可以在代理请求之前重新注释已解析的正文。

// restream parsed body before proxying
proxy.on('proxyReq', function(proxyReq, req, res, options) {
    if (req.body) {
        let bodyData = JSON.stringify(req.body);
        // 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);
    }
}

答案 1 :(得分:0)

为什么不使用快速链接? 在你的第一个函数中,只需执行以下操作:

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

答案 2 :(得分:0)

您只需使用中间件即可。

body-parser也只是一个中间件,它解析请求主体并将其置于req.body

之下

您可以这样做:

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);

通常人们使用中间件进行身份验证,基于角色的访问控制等......

您也可以在特定路线中使用中间件:

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!!");
});