首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在将响应发送到客户端之前修改它

在将响应发送到客户端之前修改它
EN

Stack Overflow用户
提问于 2022-11-04 10:59:34
回答 1查看 36关注 0票数 0

节点16.14.2,快递4.18.1

我见过很多人在将响应发送到客户端之前修改res.send以执行操作。

代码语言:javascript
运行
复制
app.use(function (req, res, next) {
    originalSend = res.send;
    res.send = function (body) {
        // Do something with the body...
        originalSend.call(this, body);
    };
    next();
});

但是,如果我发送的数据不是“body”,它会导致一些错误。

代码语言:javascript
运行
复制
originalSend = res.send;

res.send = function (body) {
    originalSend.call(this, body);
    // Works fine

    originalSend.call(this, { ...body, "USER": req.user });
    // RangeError: Too many properties to enumerate

    originalSend.call(this, {})
    // RangeError: Maximum call stack size exceeded

    originalSend.call(this, { "Foo": "bar" })
    // RangeError: Maximum call stack size exceeded
}

我几乎什么都试过了,“身体”是唯一能通过的东西,为什么?

更新:

似乎将数据转换为字符串解决了这个问题。

我仍然不知道为什么首先会出现问题,因为send应该能够处理对象和其他类型的数据(在我的应用程序中这个函数定义之外,它工作得很好)。

代码语言:javascript
运行
复制
originalSend.call(this, JSON.stringify({ ...body, "Foo": "bar" }));
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-11-04 11:30:14

以下是工作代码:

代码语言:javascript
运行
复制
const originalSend = res.send;
res.send = function (body) {
    // Do something with the body...
    originalSend.call(this, JSON.stringify({ ...JSON.parse(body), 'USER': 'user' }));

    //console.log(typeof body)
};

原因:

函数中的body参数具有string类型。这意味着originalSend.call()只接受字符串值。因此,要将自定义值与动态响应结合起来,就必须将body转换为JSON,这样就可以使用... (spread ),然后将整个第二个param转换为call,以将其转化为字符串化对象。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74315971

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档