Node.js 如何编写中间件来修改NodeJS中的响应

Node.js 如何编写中间件来修改NodeJS中的响应,node.js,encryption,Node.js,Encryption,我的客户要求我对所有请求和响应进行加密和解密。所以对于所有加密的请求,我们写下express中间件来获得解密的请求。这是最简单的部分,但在发送响应时,我们还必须对响应进行加密 编写通用函数加密数据并从所有路由调用该函数的一种方法。这是耗时的部分,因为我们在项目中有超过50条路线。所以我想编写中间件,就像我们对请求所做的那样,在发送响应之前捕获响应,然后在发送响应之后加密响应,然后将加密响应发送给客户端 我在谷歌上搜索解决方案,但没有找到适合我的合适的解决方案 routes.js rout

我的客户要求我对所有请求和响应进行加密和解密。所以对于所有加密的请求,我们写下express中间件来获得解密的请求。这是最简单的部分,但在发送响应时,我们还必须对响应进行加密

编写通用函数加密数据并从所有路由调用该函数的一种方法。这是耗时的部分,因为我们在项目中有超过50条路线。所以我想编写中间件,就像我们对请求所做的那样,在发送响应之前捕获响应,然后在发送响应之后加密响应,然后将加密响应发送给客户端

我在谷歌上搜索解决方案,但没有找到适合我的合适的解决方案

routes.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);
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以获取帮助。