在Express中显示每个请求的日志时间?

时间:2017-05-26 09:26:52

标签: javascript node.js datetime express momentjs

我在这里遇到了一些问题。我不知道为什么会这样。我把时间戳代码放在Moment.js库中,不仅仅是用于该库,最近我手动创建了显示时间戳,但是当我发送请求时,时间没有更新。 我把datetime放在我的文件路径中。但这是在服务器文件中工作。

所以例如

server.js

var express = require('express')
var app = express()
var moment = require('moment')

app.use(function(req, res, next){
  console.log(moment().format('HH:mm:ss') + ' From server.js') //Showing time now
  next();
  })

app.use('/', index)
app.listen(8001)

路由/ index.js

var express = require('express')
var app = express()
var router = express.Router()
var moment = require('moment')
var timestamps = moment().format('HH:mm:ss')

router.get('/', function(req, res){
  console.log(timestamps + ' From routes/index.js')
})

module.exports = routes

我第一次开始测试我的代码 获取localhost:8001 /

我的系统时间显示为16:20:51

[nodemon] 1.11.0
[nodemon] to restart at any time, enter `rs`
[nodemon] watching: *.*
[nodemon] starting `node ./bin/www`
16:20:51 From Server.js
16:20:51 From routes/index.js

第二次请求我的系统时间显示为16:22:52

[nodemon] 1.11.0
[nodemon] to restart at any time, enter `rs`
[nodemon] watching: *.*
[nodemon] starting `node ./bin/www`
16:22:52 From Server.js
16:20:51 From routes/index.js

不,第二个请求仍然从第一个请求获得现有时间日志,这只发生在路由中。但在server.js中工作得很好

是否因为函数外的可变时间戳而发生?但是当我在没有变量的情况下运行时,它是有效的。

router.get('/', function(req, res){
  console.log(moment().format('HH:mm:ss') + ' From routes/index.js')
})

为什么会这样? 感谢

2 个答案:

答案 0 :(得分:2)

您缓存时间戳值。

以这种方式修改您的路线文件:

var express = require('express')
var app = express()
var router = express.Router()
var moment = require('moment')

router.get('/', function(req, res){
  var timestamps = moment().format('HH:mm:ss')
  console.log(timestamps + ' From routes/index.js')
})

module.exports = routes

您必须了解该文件在应用程序启动后包含,直到它运行。这里唯一要调用的部分是路径的函数处理程序:

function(req, res){
  var timestamps = moment().format('HH:mm:ss')
  console.log(timestamps + ' From routes/index.js')
}

答案 1 :(得分:1)

你走在正确的轨道上!这是因为您在中间件*之外定义timestamps。中间件是您注册到路由的功能,它会在每个与指定URL匹配的请求上被调用。因此,当您在中间件中调用moment()时,它会返回请求的实际日期和时间,因为此函数仅在请求的处理期间执行。在您的情况下,在函数外部定义timestamps的代码只执行一次 - 在您需要routes/index.js时启动应用程序。 但是你仍然可以使用变量,只需在正确的位置定义它:

var express = require('express')
var app = express()
var router = express.Router()
var moment = require('moment')
var format = 'HH:mm:ss';

router.get('/', function(req, res){
  var timestamps = moment().format(format)
  console.log(timestamps + ' From routes/index.js')
})

module.exports = routes