最新消息: 电脑我帮您提供丰富的电脑知识,编程学习,软件下载,win7系统下载。

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

IT培训 admin 5浏览 0评论

修改了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)直接传递给原始发送。

发布评论

评论列表 (0)

  1. 暂无评论