我是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});
});
答案 0 :(得分:7)
真正的问题是模块body-parser
和http-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!!");
});