Javascript 如何向所有res.json()表达式添加时间戳
我有一堆路由器发送JSON响应。我不想添加一个Javascript 如何向所有res.json()表达式添加时间戳,javascript,node.js,json,express,Javascript,Node.js,Json,Express,我有一堆路由器发送JSON响应。我不想添加一个 {...,"timestamp": new Date()} 对每一个回应。与其他属性(如baseurl和etc)一样,就像在任何普通编码中一样,如果要对一组方法应用公共操作,则创建一个共享函数并从所有这些方法调用该函数,而不是从res.json(…) 然后,只要将此函数替换为res.json(),即可将这组公共属性添加到对象中 您还可以使用中间件,将此函数作为方法添加到res对象中,这样您就可以调用res.sendJsonExtra(obj),如
{...,"timestamp": new Date()}
对每一个回应。与其他属性(如baseurl和etc)一样,就像在任何普通编码中一样,如果要对一组方法应用公共操作,则创建一个共享函数并从所有这些方法调用该函数,而不是从
res.json(…)
然后,只要将此函数替换为res.json()
,即可将这组公共属性添加到对象中
您还可以使用中间件,将此函数作为方法添加到res
对象中,这样您就可以调用res.sendJsonExtra(obj)
,如果您更喜欢该结构的话
// middleware to add `res.sendJsonExtra()` method to each request
// so other code can then call it as needed
function jsonExtra(req, res, next) {
res.sendJsonExtra = function(obj) {
obj.timestamp = Date.now();
obj.baseurl = ...
res.json(obj);
}
next();
}
router.use(jsonExtra);
然后,任何想要添加额外数据的路由处理程序都可以调用
res.sendJsonExtra(obj)
。这可以让每个路由处理程序决定是否要添加额外的属性,并且与monkey patchingres.json()
相比,它可以使代码更加自文档化,从而改变其行为。就像在任何普通编码中一样,如果要对一组方法应用公共操作,然后创建一个共享函数并从所有这些方法调用该函数,而不是res.json(…)
然后,只要将此函数替换为res.json()
,即可将这组公共属性添加到对象中
您还可以使用中间件,将此函数作为方法添加到res
对象中,这样您就可以调用res.sendJsonExtra(obj)
,如果您更喜欢该结构的话
// middleware to add `res.sendJsonExtra()` method to each request
// so other code can then call it as needed
function jsonExtra(req, res, next) {
res.sendJsonExtra = function(obj) {
obj.timestamp = Date.now();
obj.baseurl = ...
res.json(obj);
}
next();
}
router.use(jsonExtra);
然后,任何想要添加额外数据的路由处理程序都可以调用
res.sendJsonExtra(obj)
。这让每个路由处理程序可以决定是否要添加额外的属性,这使得代码比使用monkey patchingres.json()
来改变其行为更加自我记录。无可否认,我已经有一段时间没有在NodeJS工作了,所以对此持保留态度,但类似的方法可能会奏效。它应该不允许任何下游的变化——它并不完美,因为它会弄乱响应对象,但这是一个需要您自己评估的权衡
app.use((req, res, next) => {
res._json = res.json;
res.json = function(obj) {
// add your fields to obj
obj.timestamp = new Date();
// ...
res._json(obj);
}
next();
})
app.use(/* your processing code */);
诚然,我已经有一段时间没有在NodeJS工作了,所以对此持保留态度——但也许类似的东西会奏效。它应该不允许任何下游的变化——它并不完美,因为它会弄乱响应对象,但这是一个需要您自己评估的权衡
app.use((req, res, next) => {
res._json = res.json;
res.json = function(obj) {
// add your fields to obj
obj.timestamp = new Date();
// ...
res._json(obj);
}
next();
})
app.use(/* your processing code */);
@wlh-中间件可以添加自定义头,但我认为OP希望修改使用
res.json(obj)
发送的对象,以便在发送之前向其添加属性。无法使用中间件执行此操作,因为对象尚未知。@jfriend00为什么不知道?您可以使用中间件来缓冲响应,并在将其传递到输出之前添加该字段stream@josh.trow-您的意思是截取稍后在流上发送的数据?问题的一部分在于,它当时已经被转换为JSON。另外,没有必要这样做。在调用res.json()。也许你可以用中间件拦截各种东西来破解它,但这对我来说似乎不是一个干净的解决方案。@jfriend00我同意,不是最干净的-最好添加一个新的响应方法-但是如果你真的不想更改任何现有的下游代码,重写res.json
method@wlh-中间件可以添加自定义头,但我认为OP希望修改使用res.json(obj)
发送的对象,以便在发送之前向其添加属性。无法使用中间件执行此操作,因为对象尚未知。@jfriend00为什么不知道?您可以使用中间件来缓冲响应,并在将其传递到输出之前添加该字段stream@josh.trow-您的意思是截取稍后在流上发送的数据?问题的一部分在于,它当时已经被转换为JSON。另外,没有必要这样做。在调用res.json()。也许你可以用中间件拦截各种东西来破解它,但这对我来说似乎不是一个干净的解决方案。@jfriend00我同意,不是最干净的-最好添加一个新的响应方法-但是如果你真的不想更改任何现有的下游代码,覆盖res.json
方法应该是可行的。这种猴子补丁方法可能会影响其他不希望继承新功能的路由。另外,阅读调用res.json()
的代码会让人产生误解,因为它不仅仅是发送json。@jfriend00 100%同意-但就我所知,它只需对现有代码进行最小的更改即可回答所要求的问题是的,但是,这不是IMO最推荐的解决问题的方法。这种猴子补丁方法可能会影响其他不希望继承新功能的路由。另外,阅读调用res.json()
的代码会让人产生误解,因为这不仅仅是发送json。@jfriend00 100%同意-但据我所知,它只需对现有代码进行最小的更改即可回答所要求的问题是的,但这不是解决问题的最推荐方法。