【问题标题】:show log time every request in Express?在 Express 中显示每个请求的日志时间?
【发布时间】:2017-10-27 03:23:15
【问题描述】:

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

例如

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

我第一次开始测试我的代码 获取本地主机: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')
})

为什么会发生这种情况? 谢谢

【问题讨论】:

    标签: javascript node.js datetime express momentjs


    【解决方案1】:

    您缓存时间戳值。

    这样修改你的路由文件:

    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
    

    您必须了解该文件在应用程序启动后一直包含在内,直到它运行为止。这里唯一不时调用的部分就是路由的函数handler:

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

    【讨论】:

      【解决方案2】:

      你在正确的轨道上!这是因为您在中间件*之外定义了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
      

      【讨论】:

      • 啊,我明白了,无论如何很好的解释。它工作+1谢谢:D
      猜你喜欢
      • 1970-01-01
      • 2018-06-17
      • 1970-01-01
      • 1970-01-01
      • 2021-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-01
      相关资源
      最近更新 更多