Запросы времени в NodeJS/Express
Каким будет лучший способ отправить все запросы в мое приложение node? В принципе, я хочу получить текущую временную метку в самом начале запроса, а затем снова в самом конце запроса, получить разницу и занести в журнал. Рекомендации по наилучшему способу сделать это в 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
и любую другую конечную точку, которую я мог бы добавить.
Ответы
Ответ 1
Это может помочь: 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. Следуйте этому ответу для решения - fooobar.com/questions/4722227/...
Вместо прослушивания события 'header'
в res
которое срабатывает после отправки заголовков, вы можете прослушивать событие 'finish'
, в зависимости от того, что вы хотите измерить.
Ответ 2
Для этого вы можете использовать встроенные console.time
и console.timeEnd
:
console.time('handler name');
... handle the request
console.timeEnd('handler name');
Выход на консоль:
handler name: 62ms
Ответ 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
Он очень точен и имеет разрешение наносекунд и никаких дополнительных зависимостей.
Ответ 4
вы можете добавить в ваше промежуточное ПО модуль morgan
и использовать его как this-
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
Проверьте Морган :)
Ответ 5
Просто получите текущее время в миллисекундах (например, через 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
Я предполагаю, что промежуточное ПО для времени ответа для выражения - это тот, который упоминается Тревором Диксоном по первому ответу. Теперь он позволяет вам установить обратный вызов, чтобы получить время отклика, в случае, если вам не нужно указывать заголовок X-Response-Time на ваш ответ. https://github.com/expressjs/response-time#responsetimefn
Ответ 7
В Express 4 доступно req._startTime
. Таким образом, вы можете добавить следующее выше всех других маршрутов и промежуточного программного обеспечения в ваш app.js
;
app.use((req, res, next) => {
// runs after request is finished.
res.on('finish', () => {
console.log('Time in ms', Date.now() - req._startTime);
});
next();
});