Javascript express.js-如何截获response.send()/response.json()

Javascript express.js-如何截获response.send()/response.json(),javascript,express,Javascript,Express,假设我在多个地方调用response.send(someData)。现在我想创建一个全局拦截器,在其中捕获所有。发送方法并对someData进行一些更改。在express.js中有什么方法吗?(钩子、侦听器、拦截器等)?是的,这是可能的。有两种方法可以做到这一点,一种是使用提供拦截的库,该库能够根据特定条件运行拦截: 另一个选项是只创建您自己的中间件(用于express),如下所示: function modify(req, res, next){ res.body = "this is

假设我在多个地方调用
response.send(someData)
。现在我想创建一个全局拦截器,在其中捕获所有
。发送
方法并对
someData
进行一些更改。在express.js中有什么方法吗?(钩子、侦听器、拦截器等)?

是的,这是可能的。有两种方法可以做到这一点,一种是使用提供拦截的库,该库能够根据特定条件运行拦截:

另一个选项是只创建您自己的中间件(用于express),如下所示:

function modify(req, res, next){
  res.body = "this is the modified/new response";

  next();
}
express.use(modify);
 {
  data: [
   {
    ...
   }
  ]
 }

您可以定义如下的中间件(从中获取并修改)


对于那些在谷歌上找到的人,根据最上面的答案:

app.use((req, res, next) => {
    let oldSend = res.send
    res.send = function(data) {
        console.log(data) // do something with the data
        res.send = oldSend // set function back to avoid the 'double-send'
        return res.send(data) // just call as normal with data
    }
    next()
})

您只需使用NODEJS和Express就可以了,比如您正在调用一个API,并且希望在发送响应之前发送修改数据

router.get('/id',(req,res)=>{
…//您的代码在这里填充数据
设testData={
“C1”:“数据1”,
“C2”:“数据2”,
“yourdata”:数据
};          
res.send(testData);
});

只想提供一个拦截
res.json
的实际使用示例

在编写express server时,我们可能会根据以下情况在每个响应中发送
状态
消息

app.post('/test',(req,res)=>{
res.json({status:1,消息:“some_error”,otherData:“nothing”})
})
但是,如果我不想每次都写状态和消息呢?我可以添加新函数来构建一个模板响应体,以便在使用
res.json
时发送数据

const messageMap={
0:“成功”,
1:“某些错误”
}
应用程序使用((请求、恢复、下一步)=>{
const originJson=res.json
res.json=(状态,jsonData)=>{
常数fixedResponse={
地位
message:messageMap[状态]
}
调用(res,{…jsonData,…fixedResponse})
}
下一个()
})
然后我只需要使用下面的函数

app.get(“/test”,(请求、回复)=>{
res.json(1,{otherData:1})
})
您甚至可以使用构建器模式来实现这一点

app.use((请求、回复)=>{
res.buildFixedResponse=函数(状态){
常数fixedResponse={
地位
message:messageMap[状态]
}
res.json=函数(jsonData){
调用(this,{…jsonData,…fixedResponse})
}
还这个
}
})
然后触发如下所示的函数

app.get(“/test”,(请求、回复)=>{
res.buildFixedResponse(1).json({otherData:1})
})

在我的例子中,我必须使用带有
typicode/json服务器的中间件
,并且能够获得不同于钝javascript数组的响应对象

typicode/json服务器
的响应类似于:

[
 {
   ...
 }
]
应用中间件后:

module.exports = (req, res, next) => {
 const oldSend = res.send;
 res.send = (data) => {
  const oldData = JSON.parse(data);
  // we want to change the response only if a blunt array is sent
  // also, we do this for the old sake of not sending json arrays
  if(Object.prototype.toString.call(oldData) === '[object Array]') {
   data = {
    data: oldData
   };
  }
  res.send = oldSend;
  return res.send(data);
 };
 next();
}
答复如下:

function modify(req, res, next){
  res.body = "this is the modified/new response";

  next();
}
express.use(modify);
 {
  data: [
   {
    ...
   }
  ]
 }

我试过上面的方法,它确实有效。但是,res.send对所有HTTP方法(POST、PUT、DELETE)调用了两次,而对GET只调用了一次。知道为什么要调用res.send两次吗?res.send=oldssend在调用oldssend方法之前添加上述行修复了上述问题。谢谢谢谢@Jugz,关于如何解决这个问题的解释将是非常好的,谢谢。为此,你必须看一下。正在内部再次调用流中的res.send。所以,在最初的monkey修补这个方法之后,就在您调用它之前,您将它修补回原始实现。否则会导致调用拦截器两次。不管怎样,猴子补丁并不总是一个好主意,而以上解决方案更是一个粗糙的方法。使用express Interceptor的以下答案更好在用户定义的发送功能中是否可以使用statusCode?状态代码将使用控制器中的res.Status(500)设置。如果
statusCode
200
,但如果我运行
console.log(res.statusCode),我将尝试为
响应创建一个中间件,以便设置自定义标题
在中间件功能中,即使状态代码是
404
401
500
,我也总是得到
200
。是否有其他方法可以为响应获取正确的状态代码?在发送响应之前会调用中间件。它只是检查用户是否可以访问某些路由,或者是否可以。但您可以将其用于其他内容。但它不会在到达路由后执行,尤其是在发送响应后。该路由正在按其应该的方式工作。我正在使用res.json,我已经使用您的示例覆盖了它,并在每个响应中添加了我想要发送的数据。干得好,谢谢,这对我有用!res.send=oldSend这行是importnat。