Библиотека xmlhttprequest
для node.js не полностью правильно реализует спецификацию.
Если мы углубимся в код на github, мы увидим следующую строку кода:
if (self.readyState === self.DONE && !errorFlag) {
self.dispatchEvent("load");
// @TODO figure out InspectorInstrumentation::didLoadXHR(cookie)
self.dispatchEvent("loadend");
}
Таким образом, обработчики событий load
и loadend
запускаются только при отсутствии ошибки, что согласуется с нашими наблюдениями, где
xhr.onloadend = function() {
// This should get logged, but it doesn't.
console.log( 'The request has completed.' );
};
будет регистрироваться только при успешном завершении события.
Мой совет - запускать событие вручную в обработчике .onerror()
, который работает. Имейте в виду, что это сторонний модуль node.js, а не нативный.
Лично я только что написал небольшую оболочку для xmlhttprequest, которая имитирует интерфейс .fetch()
. Версия node.js использует нативную библиотеку node.js http
, а версия на стороне клиента - xmlhttprequest.
Таким образом, я могу использовать один и тот же API .fetch()
как для внешнего кода, так и для внутреннего кода, ипросто позвольте системе решить, будет ли она использовать нативную выборку, выборку на основе xmlhttp или выборку на основе http.