Node.js 如何编写中间件来修改NodeJS中的响应
我的客户要求我对所有请求和响应进行加密和解密。所以对于所有加密的请求,我们写下express中间件来获得解密的请求。这是最简单的部分,但在发送响应时,我们还必须对响应进行加密 编写通用函数加密数据并从所有路由调用该函数的一种方法。这是耗时的部分,因为我们在项目中有超过50条路线。所以我想编写中间件,就像我们对请求所做的那样,在发送响应之前捕获响应,然后在发送响应之后加密响应,然后将加密响应发送给客户端 我在谷歌上搜索解决方案,但没有找到适合我的合适的解决方案 routes.jsNode.js 如何编写中间件来修改NodeJS中的响应,node.js,encryption,Node.js,Encryption,我的客户要求我对所有请求和响应进行加密和解密。所以对于所有加密的请求,我们写下express中间件来获得解密的请求。这是最简单的部分,但在发送响应时,我们还必须对响应进行加密 编写通用函数加密数据并从所有路由调用该函数的一种方法。这是耗时的部分,因为我们在项目中有超过50条路线。所以我想编写中间件,就像我们对请求所做的那样,在发送响应之前捕获响应,然后在发送响应之后加密响应,然后将加密响应发送给客户端 我在谷歌上搜索解决方案,但没有找到适合我的合适的解决方案 routes.js rout
router.post('/getUserData', verifyApiKey, async function (req, res, next) {
let user = await getUserData();
res.status(200).send(user)
});
class EncryptDecryptRequestResponse {
async encryptResponse(req, res, next) {
console.log('Called encryptResponse');
console.log('res.body', res.body);
res.body = encryptData(res.body)
next();
}
}
// Middleware to decrypt request
app.use(decryptRequest);
app.use('/', indexRouter);
// Middleware to encrypt response
app.use(encryptResponse);
middlware.js
router.post('/getUserData', verifyApiKey, async function (req, res, next) {
let user = await getUserData();
res.status(200).send(user)
});
class EncryptDecryptRequestResponse {
async encryptResponse(req, res, next) {
console.log('Called encryptResponse');
console.log('res.body', res.body);
res.body = encryptData(res.body)
next();
}
}
// Middleware to decrypt request
app.use(decryptRequest);
app.use('/', indexRouter);
// Middleware to encrypt response
app.use(encryptResponse);
App.js
router.post('/getUserData', verifyApiKey, async function (req, res, next) {
let user = await getUserData();
res.status(200).send(user)
});
class EncryptDecryptRequestResponse {
async encryptResponse(req, res, next) {
console.log('Called encryptResponse');
console.log('res.body', res.body);
res.body = encryptData(res.body)
next();
}
}
// Middleware to decrypt request
app.use(decryptRequest);
app.use('/', indexRouter);
// Middleware to encrypt response
app.use(encryptResponse);
但问题是,我没有从中间件获得任何控制台.log。这是我使用的我试图重现您在覆盖
res.send()
时遇到的问题,但对我来说效果很好。在定义路由之前,您需要确保设置拦截器中间件。考虑这个简单的例子:
const express = require('express');
const app = express();
function encryptResponseInterceptor(req, res, next) {
const originalSend = res.send;
res.send = function () {
arguments[0] = encryptResponse(arguments[0]);
originalSend.apply(res, arguments);
};
next();
}
function encryptResponse(originalData) {
// place your encryption logic here, I'm just adding a string in this example
return originalData + " modified";
}
// fake method that returns resolves after 1s just for testing
function getUserData() {
return new Promise(resolve => {
setTimeout(() => {
resolve();
}, 1000)
})
}
app.use(encryptResponseInterceptor);
app.get("/test", async (req, res, next) => {
await getUserData();
res.status(200).send("will be changed");
})
app.listen(3000, () => {
console.log("server started on 3000");
});
这回答了你的问题吗@eol我也尝试过该解决方案,但对meCan也不起作用。您可以共享
indexRouter
的代码吗?请查看routes.js,这是我的indexRouterThax以获取帮助。