节点16.14.2,快递4.18.1
我见过很多人在将响应发送到客户端之前修改res.send以执行操作。
app.use(function (req, res, next) {
originalSend = res.send;
res.send = function (body) {
// Do something with the body...
originalSend.call(this, body);
};
next();
});
但是,如果我发送的数据不是“body”,它会导致一些错误。
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应该能够处理对象和其他类型的数据(在我的应用程序中这个函数定义之外,它工作得很好)。
originalSend.call(this, JSON.stringify({ ...body, "Foo": "bar" }));
发布于 2022-11-04 11:30:14
以下是工作代码:
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
,以将其转化为字符串化对象。
https://stackoverflow.com/questions/74315971
复制相似问题