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。