Вопрос: Можно ли использовать AbortController с запросами POST без немедленного запуска события закрытия на сервере? Если нет, существует ли более подходящий инструмент/метод для отмены запросов на публикацию?
Справочная информация: AbortController работает, как и ожидалось, с запросами GET, но при использовании с запросами POST он немедленно запускает req.on('close', handleClose) в моем экспресс-маршруте, даже если клиент не прервал запрос.
Код: В упрощенном коде ниже, если клиент нажимает клавишу Escape, Запрос на получение данных прерван. Сервер имеет встроенную 10-секундную задержку.
Express Server:
import express from 'express';
import bodyParser from 'body-parser';
const router = express.Router();
const jsonParser = bodyParser.json();
router.post('/test', jsonParser, async (req, res) => {
req.on('close', handleClose);
await delay();
return res.send();
function handleClose() {
console.log('signal aborted');
}
function delay() {
return new Promise(function(resolve) {
setTimeout(() => {
resolve();
}, 10000);
});
}
});
JS в клиенте:
const button = document.getElementById('button');
button.addEventListener('click', press_button);
async function press_button() {
const controller = new AbortController();
addListeners_keyUp();
const postBody = {
'one': 1
};
const response = await fetch('/test', {
body: JSON.stringify(postBody),
headers: { 'Content-Type': 'application/json' },
method: 'post',
signal: controller.signal
});
console.log('the end');
function abort_fetch() {
controller.abort();
}
function addListeners_keyUp() {
document.addEventListener('keyup', process_keyUp);
}
function check_abortEvent(event) {
return event.key === 'Escape' ? true : false;
}
function process_keyUp(event) {
const abortEvent = check_abortEvent(event);
if (abortEvent) {
abort_fetch();
}
}
}
Подробнее здесь: https://stackoverflow.com/questions/798 ... ally-trigg