Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何向所有res.json()表达式添加时间戳_Javascript_Node.js_Json_Express - Fatal编程技术网

Javascript 如何向所有res.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),如

我有一堆路由器发送JSON响应。我不想添加一个

{...,"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 patching
res.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 patching
res.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%同意-但据我所知,它只需对现有代码进行最小的更改即可回答所要求的问题是的,但这不是解决问题的最推荐方法。