Запросы времени в 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();
});