【问题标题】:Override Node.js Express response method覆盖 Node.js Express 响应方法
【发布时间】:2015-12-06 06:51:06
【问题描述】:

我想稍微改变 res.json(obj) 方法的默认 expressjs 行为。我试图在我自己的中间件中覆盖它,问题是我需要在里面调用它的原始内容。

但现在它只是调用自身导致堆栈溢出。

app.use(function(req, res, next) {
    res.json = function(obj) {
        function delete_null_properties(obj) {
            // ...
        }
        delete_null_properties(obj);

        res.json(obj);
    };
    next();
});

【问题讨论】:

  • 您为什么要这样做?我认为您正在解决错误的问题...您能解释一下您想要实现的目标,即您需要更改的内容吗?
  • @Sergio,它显示在代码中。我想要相同的json,但没有空键。我希望它在整个应用程序中是透明的,就像默认方法一样。
  • 但是res.json 会将响应发送回客户端......之后您有一个next()。您正在干扰 Expresses 对 clienth 方法的响应之一。我相信您可以通过其他方式解决您的问题。
  • 会不会像重写 res.render 方法一样 - stackoverflow.com/questions/9285880/…
  • @Sergio,你为什么认为干扰快递的方法不好?你认为它会破坏严格依赖这种方法的模块中的功能吗?无论如何,我认为在删除空值的情况下没有太多需要担心的变化。

标签: javascript node.js express


【解决方案1】:

我不太了解 express 的内部工作原理,但似乎这样的东西应该可以工作

app.use(function(req, res, next) {
    var json = res.json;
    res.json = function(obj) {
        function delete_null_properties(obj) {
            // ...
        }
        delete_null_properties(obj);

        json.call(this, obj);
    };
    next();
});

编辑:根据user3537411this 之前对类似问题的回答,将json(obj) 更改为json.call(this, obj)

附:我从 我不太了解 express 的内部工作原理 开始回答,以避免那种只在答案上胡言乱语而没有真正了解为什么答案不好的 cmets ... 相反我得到了同样毫无意义的评论。你不能用 SO 巨魔取胜

【讨论】:

  • 你在哪里打电话res.json()
  • @JaromandaX 是的,我认为 3 个错误的事情。首先是你重写了一个 send 方法,甚至从不调用它,你将一个函数传递给它并在它之后调用next()...哦,我不是那个问这个问题的人。
  • @Sergio - 简单的错误,我的意思是 THE question - 不是 your question
  • @JaromandaX 没问题。我评论的主要部分是回答您(现已删除)的评论,询问您的答案有什么问题。
  • @JaromandaX,谢谢!您的答案只需稍作改动即可:var _json = res.json;_json.call(this, obj);
【解决方案2】:

你可以像下面这样,在const app = express();之后不要使用this.json并且不要在函数内部使用this.send,否则你会得到一个最大调用大小错误:

app.response.json = function(body: any) {
    this.contentType('json').end(JSON.stringify(
      {
          code: ApiCode.OPERATION_SUCCES,
          message: CommonMessages.OperationSuccess.message,
          data: body,
          description: CommonMessages.OperationSuccess.description
        }
    ));
    return this; 
}

【讨论】:

    【解决方案3】:

    它也可能有用

    https://github.com/muratcorlu/connect-api-mocker/pull/30

    安装两次将只应用最后一次。

    const express = require('../../node_modules/express');
    
    const app = express();
    
    // default response
    app.use('/', (req, res, next) => {
      next();
    
      try {
        res.send({
          profile: {
            first_name: 'Aaron',
            last_name: 'Pol'
          }
        });
      } catch (e) {
        //
      }
    });
    
    // definite state, where default response can be changed
    app.use('/', (req, res) => {
      res.send({
        profile: {
          first_name: 'John',
          last_name: 'Pol'
        }
      });
    });
    
    app.listen(9090);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-20
      • 2014-07-24
      • 2016-11-12
      • 1970-01-01
      • 2016-06-29
      • 1970-01-01
      • 2020-11-05
      • 2021-12-28
      相关资源
      最近更新 更多