修改express.js res.send函数后,它将不会发出任何数据

时间:2019-10-04 10:07:52

标签: node.js express

基本上我想做的就是统一我的应用程序的每个响应,以使它们看起来像这样

{
  success: true,
  error: "Error description",
  errorCode: "SomeError",
  data: {
    ...
  }
}

在任何地方复制和粘贴此结构以及包装函数对我来说都很难看,因此我尝试修改send函数,使其接受4个参数而不是仅接受1个参数,然后构造给定的结构。 / p>

我找到了有关如何修改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);

除了不会向客户端返回任何响应之外,其他都可以正常工作。你能帮我解决这个问题吗?有可能实现预期的行为吗?

1 个答案:

答案 0 :(得分:1)

您正在使用function.apply,它需要一个this,然后是一个函数参数数组(请参见MDN for function.prototype.apply)。您需要使用的是function.call(再次参见MDN for function.prototype.call)。

但是,要小心一点,要小心覆盖Express(或任何库)的低级部分-您不知道还有什么可能被调用,所以您可能会得到一些意想不到的结果。您可能想检查(例如)提供的参数是否属于您期望的类型(例如,对象),并将任何意外内容(例如,Buffer)直接传递到原始发送。