Узлы: журналы Morgon не регистрируют полное время ответа, когда потоковая передача включена - PullRequest
0 голосов
/ 10 ноября 2018

У меня есть код, который выполняет простую потоковую передачу HTML с использованием nodejs и express. Первый поток происходит через 3 секунды, второй поток - через 6 секунд, а последний поток - через 9 секунд. Код включен с журналом Morgon для регистрации времени ответа. Время отклика, которое регистрируется через Morgon, отображается как 3 секунды (регистрируется время отклика первого потока). Есть ли способ в Morgon или в nodejs или в экспрессе получить полное время отклика при включенной потоковой передаче? Помогает очень ценится.

var express = require("express");
var bodyParser = require('body-parser');
var utf8 = require('utf8');
var axios = require('axios');
var morgan = require('morgan')
var fs = require('fs')
var path = require('path')
var app = express();
var port = 3000;
app.use(bodyParser.urlencoded({ extended: false }));
var urlencodedParser = bodyParser.urlencoded({ extended: true })
app.use(function(req, res, next) {
        var decodedUrl = decodeURIComponent(req.originalUrl);
        req.originalUrl = decodedUrl;
    next();
});
var accessLogStream = fs.createWriteStream(path.join(__dirname, 'access.log'), { flags: 'a' })
app.use(morgan(':method :url :response-time'))
// respond with "hello world" when a GET request is made to the homepage
app.get("/test/*/id*", urlencodedParser, function (req, res) {

    let soapUIHeader = '<dummy></dummy>';
    setTimeout(function() {
        res.write('<div><p>Header........</p><div>');
        setTimeout(function body() {
            res.write('<div><p>Body........</p><div>');
            setTimeout(function footer() {
                res.write('<div><p>Footer........</p><div>');
                res.end();
            },3000)
        },3000);
    },3000)
});


app.listen(port, function() {
    console.log("server started in port " + port);
});

module.exports = app

1 Ответ

0 голосов
/ 19 июня 2019

Лучший способ измерить время отклика, когда у нас включена потоковая передача ответов, - использовать промежуточное ПО. Вот шаги:

Ввести функцию промежуточного программного обеспечения setReqBeginTime в начале экспресс-запроса. Эта функция фиксирует текущее время запроса и сохраняет его как заголовок запроса (req.headers ['reqBeginTime'] = currentTime;). Добавьте еще одну функцию logResponeEndTime в конце экспресс-запроса. Эта функция получает окончательное время выполнения запроса и время отклика, вычитая reqBeginTime.

Надеюсь, это поможет

let setReqBeginTime = (req, res, next) => {
	var currentTime = Date.now();
	req.headers['reqBeginTime'] = currentTime;
	next();
}

let logResponeEndTime = (req, res, next) => {
	var currentTime = Date.now();
	var reqBeginTime = req.headers['reqBeginTime'];
	var responseTime = currentTime - reqBeginTime;
	req.headers['respEndTime'] = responseTime;
	next();
}

app.get("/test/*/id*", setReqBeginTime(), urlencodedParser, function (req, res) {

    let soapUIHeader = '<dummy></dummy>';
    setTimeout(function() {
        res.write('<div><p>Header........</p><div>');
        setTimeout(function body() {
            res.write('<div><p>Body........</p><div>');
            setTimeout(function footer() {
                res.write('<div><p>Footer........</p><div>');
                res.end();
            },3000)
        },3000);
    },3000)
}, logResponeEndTime());
...