簡體   English   中英

Monkeypatch重新發送

[英]Monkeypatch res.send

來自大學的建議並遵循此答案

我正在嘗試修補res.send補丁,但出現以下錯誤:

TypeError: Cannot read property 'req' of undefined

這是我的代碼

const express = require('express')
const app = express()

app.use((req, res, next ) => {
    const oldSend = res.send;
    res.send = (data) => {
        console.log(data.length);
        oldSend(data);
    }
    next();
})
app.get('/', (req, res) => res.send('Hello World!'))

完整的堆棧跟蹤:

Example app listening on port 3000!
undefined
TypeError: Cannot read property 'req' of undefined
    at send (/Users/code/js/hello/node_modules/express/lib/response.js:110:17)
    at ServerResponse.res.send (/Users/code/js/hello/index.js:8:9)
    at app.get (/Users/code/js/hello/index.js:12:32)
    at Layer.handle [as handle_request] (/Users/code/js/hello/node_modules/express/lib/router/layer.js:95:5)
    at next (/Users/code/js/hello/node_modules/express/lib/router/route.js:137:13)
    at Route.dispatch (/Users/code/js/hello/node_modules/express/lib/router/route.js:112:3)
    at Layer.handle [as handle_request] (/Users/code/js/hello/node_modules/express/lib/router/layer.js:95:5)
    at /Users/code/js/hello/node_modules/express/lib/router/index.js:281:22
    at Function.process_params (/Users/code/js/hello/node_modules/express/lib/router/index.js:335:12)
    at next (/Users/code/js/hello/node_modules/express/lib/router/index.js:275:10)

第110行是:

res.send = function send(body) {
  var chunk = body;
  var encoding;
  var req = this.req; //<-- THIS 
  var type;

  // settings
  var app
....

這是因為方法沒有綁定到JavaScript中的實例。

如果調用a.fun()該函數的代碼里面, this最初被設定為a 但這僅是因為在方法調用中出現了a :否則fun是與a無關的任意函數。

在您的情況下,這應該起作用:

oldSend.call(res, data);

call()是設置this

找到解決方案后,oldSend失去了上下文(?)

如果我添加bind(res)

const oldSend = res.send.bind(res);

問題解決了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM