Странное поведение с использованием `req.destroy ()` и Firefox - PullRequest
0 голосов
/ 16 февраля 2020

Я использую некоторое промежуточное программное обеспечение для регистрации каждого полученного запроса (на консоль). У меня есть пара маршрутов, на которые я не хочу отвечать, я просто хочу отбросить любой отправленный им запрос; Я не хочу возвращать код состояния, я просто хочу отбросить запрос.

Когда я просматриваю «отброшенный» маршрут, используя Firefox, я регистрирую 10 запросов. Например, Firefox отправляет мне 10 запросов, прежде чем сдаться. Я не вижу такого поведения в Chrome или при использовании Почтальона. При использовании Chrome изначально я вижу два запроса: исходный запрос + один для favicon.ico, после того как я переосмыслил sh, et c., Chrome отправляет только один запрос

Код ниже можно найти на GitHub - поэтому, если вы хотите проверить это самостоятельно, пожалуйста, не стесняйтесь использовать этот репо.

Почему Firefox отправляет ровно 10 запросов раньше сдаваться при использовании req.destroy()? Есть ли способ уменьшить это в Node / Express?

/ src / index. js

const express = require('express');
const chalk = require('chalk');
const { logger, addIdToRequest } = require('./middleware');
const { destroyRequest, routeNotFound, helloWorld } = require('./utils');

const initializeExpress = () => {
    const app = express();
    app.set('port', 3000);
    app.use(addIdToRequest);
    app.use(logger);
    app.use(express.json());
    app.use(express.urlencoded({ extended: false }));
    app.get('/', destroyRequest);
    app.get('/hello', helloWorld);
    app.use(routeNotFound);
    const server = app.listen(app.get('port'), () => {
        console.log(chalk.green(`Server listening on port ${app.get('port')}`));
    });
    return server;
};

const server = initializeExpress();
module.exports = { server };

/ src / middleware . js

const { newGuid, FriendlyDate } = require('./utils');
const { cyan, magenta, green } = require('chalk');

function logger(req, res, next) {
    const { log } = console;
    const fdt = new FriendlyDate(FriendlyDate.now()).toFriendlyDateTime();
    log(`\r\n${green('*'.repeat(50))}`);
    log(cyan(`${fdt} Request '${magenta(req.__reqId)}' received - ${req.headers['user-agent']}`));
    log(green('*'.repeat(50)));
    next();
}

function addIdToRequest(req, res, next) {
    req.__reqId = newGuid();
    next();
}

module.exports = {
    logger,
    addIdToRequest,
}

/ src / utils. js

const { yellow, magenta } = require('chalk');

function newGuid() {
    return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, c => {
        const r = (Math.random() * 16) | 0;
        const v = c === 'x' ? r : (r & 0x3) | 0x8;
        return v.toString(16);
    });
};

class FriendlyDate extends Date {
    toFriendlyDateTime = () => {
        return `${this.toLocaleDateString()} ${this.toLocaleTimeString()}`;
    }
}

function destroyRequest(req, res) {
    console.log(`${yellow(`Destroying Request ${magenta(req.__reqId)} sent to '${req.originalUrl}'`)}\r\n`);
    req.destroy();
}

function routeNotFound(req, res) {
    res.status(404).send('<h1>Unable to find that</h1>');
}

function helloWorld(req, res) {
    res.status(200).send('<h1 style="color: green">Hello, World!</h1>')
}

module.exports = {
    destroyRequest,
    routeNotFound,
    helloWorld,
    FriendlyDate,
    newGuid,
}

упаковка. json

{
  "name": "firefox-req-destroy-poc",
  "version": "1.0.0",
  "description": "",
  "main": "src/index.js",
  "scripts": {
    "start": "node ./src"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "chalk": "^3.0.0",
    "express": "^4.17.1"
  }
}

Использование Firefox: Using Firefox

Использование Chrome (2 запроса, 1 для оригинала, 1 для favicon ): Using Chrome

Использование Почтальона: enter image description here

Версии рассматриваемого программного обеспечения:

  • Узел v13.8.0
  • Firefox 73.0 (64-бит)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...