修改了express.js res.send函数后,它不会发出任何数据
基本上,我想做的是统一应用程序的每个响应,以使它们看起来像这样
{
success: true,
error: "Error description",
errorCode: "SomeError",
data: {
...
}
}
在任何地方复制和粘贴此结构以及包装器函数对我来说都很难看,所以我试图修改send
函数,使其接受4个参数而不是仅接受1个参数,然后构造给定的结构。
我找到了有关如何修改send
函数的各种示例,并提出了此中间件
app.use(function (req, res, next) {
const oldSend = res.send;
res.send = function (data = {}, success = true, error = '', errorCode = '') {
let response = {
data,
success,
error,
errorCode
};
oldSend.apply(res, response);
};
next();
});
所以res.send调用看起来像这样
res.json(req.session.key != null, true, null, null);
除了不会向客户端返回任何响应之外,其他都可以正常工作。你能帮我解决这个问题吗?是否可以实现预期的行为?
回答如下:您正在使用function.apply
,它需要一个this
,然后是一个函数参数数组(请参见MDN for function.prototype.apply)。您需要使用的是function.call
(再次参见MDN for function.prototype.call)。
但是,要小心以覆盖Express(或任何库)的低级部分,请小心谨慎-您不知道还有什么叫这个,所以您可能会得到一些意想不到的结果。您可能想检查(例如)提供的参数是否属于您期望的类型(例如,对象),并将任何意外内容(例如Buffer
)直接传递给原始发送。
修改了express.js res.send函数后,它不会发出任何数据
基本上,我想做的是统一应用程序的每个响应,以使它们看起来像这样
{
success: true,
error: "Error description",
errorCode: "SomeError",
data: {
...
}
}
在任何地方复制和粘贴此结构以及包装器函数对我来说都很难看,所以我试图修改send
函数,使其接受4个参数而不是仅接受1个参数,然后构造给定的结构。
我找到了有关如何修改send
函数的各种示例,并提出了此中间件
app.use(function (req, res, next) {
const oldSend = res.send;
res.send = function (data = {}, success = true, error = '', errorCode = '') {
let response = {
data,
success,
error,
errorCode
};
oldSend.apply(res, response);
};
next();
});
所以res.send调用看起来像这样
res.json(req.session.key != null, true, null, null);
除了不会向客户端返回任何响应之外,其他都可以正常工作。你能帮我解决这个问题吗?是否可以实现预期的行为?
回答如下:您正在使用function.apply
,它需要一个this
,然后是一个函数参数数组(请参见MDN for function.prototype.apply)。您需要使用的是function.call
(再次参见MDN for function.prototype.call)。
但是,要小心以覆盖Express(或任何库)的低级部分,请小心谨慎-您不知道还有什么叫这个,所以您可能会得到一些意想不到的结果。您可能想检查(例如)提供的参数是否属于您期望的类型(例如,对象),并将任何意外内容(例如Buffer
)直接传递给原始发送。