我的客户给我要求加密解密所有请求响应。因此,对于所有加密的请求,我们写下了快速中间件以获取解密的请求。这很简单,但是在发送响应时,我们还必须对响应进行加密。
一种编写通用函数来加密数据并从所有路由调用该函数的方法。这是耗时的部分,因为我们在项目中有超过50条路线。所以我在考虑编写中间件,就像我们为请求所做的那样,在发送之前捕获响应,然后在对客户端发送加密响应之后对响应进行加密。
我在google中寻找解决方案,但没有任何适合我的解决方案。
routes.js
router.post('/getUserData', verifyApiKey, async function (req, res, next) {
let user = await getUserData();
res.status(200).send(user)
});
middlware.js
class EncryptDecryptRequestResponse {
async encryptResponse(req, res, next) {
console.log('Called encryptResponse');
console.log('res.body', res.body);
res.body = encryptData(res.body)
next();
}
}
App.js
// Middleware to decrypt request
app.use(decryptRequest);
app.use('/', indexRouter);
// Middleware to encrypt response
app.use(encryptResponse);
但是问题是我没有从中间件得到任何console.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");
});
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句