Ошибка при выполнении http-запроса: не определено: 1 <head><title> Документ перемещен </title></head> - PullRequest
1 голос
/ 25 апреля 2020

Получение ошибки при выполнении http-запроса в узле. В то время как я использую код, подобный следующему, я получаю ошибку.

Я пробовал как следующий код:

const http = require('http')

class postalData {

 async getPostData(pinCode){
  let result = new Promise((resolve, reject) => {
    http.get('http://postalpincode.in/api/pincode/' + pinCode,(res)=>{
      let data = '';

      // A chunk of data has been recieved.
      res.on('data', (chunk) => {
        data += chunk;
      });

      // The whole response has been received. Print out the result.
      res.on('end', () => {
        resolve(JSON.parse(data).explanation);
      });

    }).on("error", (err) => {
      reject(err.message);
    });  
  })
  const newLocal = await result
  return newLocal
 }
}

const getData = new postalData()
console.log('Post data : ', getData.getPostData(400705))

Получение ошибки ниже выполнения http-запроса в узле. в то время как я использую код, подобный следующему, я получаю ошибку. как показано ниже:

undefined:1
<head><title>Document Moved</title></head>
^

SyntaxError: Unexpected token < in JSON at position 0
    at JSON.parse (<anonymous>)
    at IncomingMessage.<anonymous> (/home/rahul/indian-post/a.js:23:22)
    at IncomingMessage.emit (events.js:327:22)
    at endReadableNT (_stream_readable.js:1201:12)
    at processTicksAndRejections (internal/process/task_queues.js:84:21)

Мой ожидаемый результат:

{
   "Message":"Number of Post office(s) found: 1",
   "Status":"Success",
   "PostOffice":[
      {
         "Name":"Sanpada",
         "Description":"",
         "BranchType":"Sub Post Office",
         "DeliveryStatus":"Delivery",
         "Taluk":"NA",
         "Circle":"NA",
         "District":"Thane",
         "Division":"New Mumbai",
         "Region":"Mumbai",
         "State":"Maharashtra",
         "Country":"India"
      }
   ]
}

Ответы [ 2 ]

2 голосов
/ 25 апреля 2020

Запрос http://postalpincode.in/api/pincode/400705 приводит к ответу 301 Moved Permanently с заголовком Location: http://www.postalpincode.in/api/pincode/400705, который сообщает, что ресурс доступен по адресу http://www.postalpincode.in/api/pincode/400705.

Если вы откроете http://postalpincode.in/api/pincode/400705 в браузере он автоматически обработает этот ответ 301 и откроет данное местоположение.

Модуль http узла не делает этого, он дает вам фактический ответ (который является предполагаемым поведением http module)

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

Вам необходимо проверить response.statusCode, если это 301 или 302, если это так, вам нужно получить заголовок Location, используя response.getHeader(name), и повторите запрос, для нового ответа вам нужно будет сделать то же самое в случае, если там произойдет еще одно перенаправление.

1 голос
/ 25 апреля 2020

Вы пытаетесь использовать простой http-вызов, но сервер отвечает redirect (Document Moved). узел http не будет следовать за перенаправлением, поэтому он отвечает HTML для перенаправления.

Вы можете использовать request package для того, чтобы следовать перенаправлению, или более простой пакет, такой как follow-redirects. Они предоставляют замену для узла http, который следует за перенаправлениями.

РЕДАКТИРОВАТЬ: Если вы не хотите использовать внешние библиотеки, просто проверьте заголовки ответа и statusCode, например request do:

if (response.statusCode >= 300 && response.statusCode < 400 && response.headers['location']) { /* retry the http request at the location */ }
...