Есть следующий скрипт (one-request.js)
#!/usr/bin/env node
var request = require('request');
const cheerio = require('cheerio');
var options = {
url: 'https://www.accuweather.com/en/us/anchorage-ak/99501/daily-weather-forecast/346835?day=1', // Anchorage
headers: {
'User-Agent':'Web/2.0',
'Connection':'keep-alive'
}
};
function callback(error, response, body) {
if (!error && response.statusCode == 200) {
var $ = cheerio.load(body);
var title = $('div#header-logo > a:first-child > span').text();
console.info('title:',title); // title: Anchorage Daily Weather
}
}
request(options, callback);
Он запускается на домашнем компьютере (узел one-request.js) и получает успешный ответ.
Однако при выполнении сценария в Heroku (героку запустить one-request.js) ответа нет. Такой же эффект получается при запуске скрипта на домашнем компьютере, если в запросе убраны заголовки. Поэтому предполагаю, что проблема в формировании заголовков в Heroku (тестировал также версию 'User-Agent': 'Mozilla / 5.0 (X11; Ubuntu; Linux x86_64; rv: 59.0) Gecko / 20100101 Firefox / 59.0. Тот же эффект).
Если запрошенный адрес не требует заголовков (для других сайтов), результаты сценария одинаково успешны как для дома, так и для Heroku.
Как сделать запрос в Heroku?
Когда я говорил об удалении заголовков, я имел в виду удаление заголовков фрагментов кода: {'User-Agent': 'Web / 2.0', 'Connection': 'keep-alive'} Да, конечно, некоторые заголовки все еще передаются.
Журнал Heroku имеет вид 2018-05-14T15: 49: 18.816424 + 00: 00 heroku [run.3272]: запуск процесса командой one-request.js 2018-05-14T16: 00: 55.707608 + 00: 00 heroku [run.3272 ]: Процесс завершен со статусом 0 2018-05-14T16: 00: 55.882608 + 00: 00 heroku [run.3272]: состояние изменено с «вверх» на «завершено»
Ответ приходит через 10 минут, и это не то, что ожидалось.
Когда он наконец прибудет, каков будет ответ?
Никакого ответа не получено. Судя по всему, скрипт останавливается по таймауту.
После нескольких экспериментов я предполагаю, что Accuweather просто блокирует адреса Heroku. С локального компьютера данные все еще могут быть успешно получены. Обнаружена блокировка еще одного хостинга, с которого ранее успешно запрашивались данные Accuweather. Блокировка началась 05.08.2018. Это их право.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Что вы имеете в виду под «Такой же эффект получается при запуске скрипта на домашнем компьютере, если в запросе убрать заголовки»? HTTP-запрос по определению имеет заголовки (по крайней мере, он должен включать HTTP-команду и путь, например
GET / http/1.1). Вы пытались проверить запрос, который делает ваше приложение, например зарегистрировав это?