NodeJS fetch ("https://www.google.com") говорит "TypeError: NetworkError при попытке извлечь ресурс", но это было 200 - PullRequest
0 голосов
/ 01 апреля 2020

Моя Firefox вкладка "Сеть разработчика" говорит, что вызов был 200 и даже показывает страницу, но и fetch и axios говорят, что произошел сбой из-за сетевой ошибки.

ax ios звонок был просто ==>

    axios.get('https://www.google.com', {
        headers: {
            'Access-Control-Allow-Origin': '*',
            'Access-Control-Allow-Methods': 'GET, PUT, POST, DELETE, HEAD, OPTIONS, PATCH'
        }
    }).then((response) => {
        alert(response); 
    }, (error) => { 
            alert("error = " + error); 
    }); 

Это должно быть что-то простое / глупое, но я просто не могу понять это. : - (

О да. Edge делает то же самое ...

(РЕДАКТИРОВАНИЕ) БОЛЬШЕ ДЕТАЛЕЙ

Если я добавлю расширение UNBLOCK CORS в свой браузер И закомментируйте мои две строки заголовка, это работает. Со строками заголовка это не работает - так что они должны быть не правы, но я не вижу, как.

то есть

axios.get('https://www.google.com', {
    headers: {
        // 'Access-Control-Allow-Origin': '*',
        // 'Access-Control-Allow-Methods': 'GET, PUT, POST, DELETE, HEAD, OPTIONS, PATCH'
    }
}).then((response) => {

работает

Есть идеи?

1 Ответ

0 голосов
/ 01 апреля 2020

Как вы уже обнаружили, проблема заключается в том, что это запрос перекрестного происхождения, который разрешен только для CORS.

Однако кажется, что вы неправильно поняли CORS.

Весь смысл из политики того же происхождения является то, что люди не должны иметь возможность делать то, что вы пытаетесь сделать здесь - отправьте запрос в браузере со страницы домена A на страницу домена B. Единственное исключение - когда B (не A!) Явно позволяет получать запросы из домена A (или из домена *).

Так что, в вашем случае, Google (не вы) будет иметь отправить эти заголовки в ответе , чтобы сообщить браузеру, что этот запрос разрешен, и он должен вернуть результаты в ваш код. Конечно, Google этого не делает, поэтому, хотя это 200, вы никогда не получите результат, потому что браузеры увидят, что в этом ответе 200 эти заголовки CORS отсутствуют.

Единственный способ для вас заставить это работать, не полагаясь на расширение, чтобы отключить этот механизм (кроме того, чтобы попросить Google добавить исключение для вашего домена ?), было бы прокси-запрос на этот запрос через ваш сервер. Если ваш сервер отправляет запрос в Google, а не скрипт на вашей странице, он, конечно, будет работать, так как это политика, которую браузеры применяют, а сервер не находится внутри браузер. Таким образом, вам придется отправить запрос на ваш сервер, который перенаправит его в Google, а затем передаст ответ от Google обратно на ваш код на странице.

С вашей стороны, похоже, возникла путаница по поводу что означает отправка запроса: в заголовке вашего вопроса вы написали «NodeJS» (что подразумевало бы отправку его уже с сервера), но на самом деле вы отправляете запрос из скрипта в браузере (что очевидно, поскольку вы говорите о Firefox вкладка сети, и вы используете alert, которого нет в node.js, плюс вы говорите о расширении браузера), поэтому к вам применяются правила браузера.

См. Также:


Примечание: почему? не удается использовать расширение Unblock CORS с подключенными заголовками (вместо игнорируемых заголовков), я не уверен, b но это не имеет значения, потому что в запросе эти заголовки в лучшем случае бесполезны, а в худшем случае недопустимы.

...