将所有请求计入我的节点应用程序的最佳方法是什么?基本上我想在请求的最开始时获取当前时间戳,然后在请求的最后再次获取,获取差异并记录它。有关在NodeJS和Express中执行此操作的最佳方法的建议吗?
以下是我的应用程序的样子(虽然比这复杂得多)。
var express = require('express'),
http = require('http'),
app = express();
app.get('/', function (req, res, next) {
res.send(200, 'hi');
});
app.get('/about', function(req, res, next) {
res.send(200, 'something else');
});
var server = http.createServer(app);
server.listen(9000);
console.log("Express server listening...");
我想要时间所有请求。所以我想要时间/
和/about
以及我可能添加的任何其他端点。
答案 0 :(得分:47)
这可能会起到作用:http://www.senchalabs.org/connect/responseTime.html
app.use(express.responseTime());
或者做这样的事情:
app.use(function(req, res, next) { req.start = Date.now(); next(); });
app.get(...);
app.get(...);
app.use(function(req, res) { var time = Date.now() - req.start; });
这要求您的所有路线都拨打next()
。
或许这个(与responseTime中间件相同,但没有设置标题):
app.use(function(req, res, next) {
var start = Date.now();
res.on('header', function() {
var duration = Date.now() - start;
// log duration
});
next();
});
快递中的Connect中间件触发了标头事件,该版本从版本4开始被删除。请按照此答案寻求解决方案 - https://stackoverflow.com/a/27348342/4969957
您可以监听'header'
事件,而不是收听res
上发送标头后发出的'finish'
事件,具体取决于您要衡量的内容。
答案 1 :(得分:8)
您可以使用内置的console.time
和console.timeEnd
功能:
console.time('handler name');
... handle the request
console.timeEnd('handler name');
输出到控制台:
handler name: 62ms
答案 2 :(得分:3)
或者如果您想要更大的时间分辨率,您可以使用process.hrtime()或使用我使用hrtime构建的模块,但会为您提供大量额外信息,如平均值,中位数,总时间等。模块称为exectimer。这是一个例子:
var t = require("exectimer");
app.use(function(req, res, next) {
var tick = new t.Tick("responseTime");
tick.start();
res.on('header', function() {
tick.stop();
});
next();
});
// when ready check the results with this:
var responseTime = t.timers.responseTime;
console.log(responseTime.min()); // minimal response time
console.log(responseTime.max()); // minimal response time
console.log(responseTime.mean()); // mean response time
console.log(responseTime.median()); // median response time
它非常准确,分辨率为纳秒,没有额外的依赖性。
答案 3 :(得分:1)
我认为快递的响应时中间件是Trevor Dixon在第一个答案中提到的。它现在允许您设置回调以获取响应时间,以防您不需要在响应上设置X-Response-Time标头。 https://github.com/expressjs/response-time#responsetimefn
答案 4 :(得分:1)
您可以将模块morgan
添加到您的中间件并使用它 -
const morgan = require('morgan')
...
...
const app = express()
app.use(morgan('dev'))
然后日志将如下所示:
// :method :url :status :response-time ms - :res[content-length]
GET /myroute 200 339.051 ms - 242
检查morgan:)
答案 5 :(得分:0)
当您第一次获得请求的句柄时,只需获得当前时间(例如通过new Date()
),然后获取完成响应的时间,并将差值作为经过的时间(以毫秒为单位)。
http.createServer(function(req, res) {
res.timeStart = new Date();
// ...
res.end(...);
var timeStop = new Date();
console.log('Elapsed ' + (timeStop-req.timeStart) + 'ms');
});
请注意,您可以减去日期,因为Date#valueOf()
会以毫秒为单位返回时间。
答案 6 :(得分:0)
export const measureRequestDuration = (req, res, next) => {
const start = Date.now();
res.once('finish', () => {
const duration = Date.now() - start;
console.log("Time taken to process " + req.originalUrl + " is: " +
duration);
});
next();
};
然后
app.use(measureRequestDuration);