Я использую некоторое промежуточное программное обеспечение для регистрации каждого полученного запроса (на консоль). У меня есть пара маршрутов, на которые я не хочу отвечать, я просто хочу отбросить любой отправленный им запрос; Я не хочу возвращать код состояния, я просто хочу отбросить запрос.
Когда я просматриваю «отброшенный» маршрут, используя 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:
Использование Chrome (2 запроса, 1 для оригинала, 1 для favicon ):
Использование Почтальона:
Версии рассматриваемого программного обеспечения:
- Узел v13.8.0
- Firefox 73.0 (64-бит)