猿问

执行 http 请求时出错:未定义:1 <head><title>Document Moved

在节点中执行 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"

      }

   ]

}


HUWWW
浏览 303回答 2
2回答

MM们

该请求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响应并打开该给定位置。node的http模块不会这样做,它会为您提供实际的响应(这是http模块的预期行为)如果您想使用该模块,那么您需要编写自己的逻辑来遵循重定向或使用像requestwich 这样的库提供了遵循这些重定向的选项。您需要检查response.statusCode是否是301或302,如果是,则需要使用 获取Location标头response.getHeader(name),然后重新发出请求,对于新的响应,您需要执行相同的操作,以防发生另一个重定向。

拉莫斯之舞

您正在尝试使用普通的 http 调用,但服务器正在响应redirect(Document Moved)。节点http不会跟随重定向,因此它会响应重定向的 HTML。您可以使用requestpackage来跟踪重定向,或者使用更简单的包,例如follow-redirects.&nbsp;http它们为跟随重定向的节点提供了一个替代品。编辑:如果您不想使用外部库,只需检查响应标头和 statusCode,如下所示request:if&nbsp;(response.statusCode&nbsp;>=&nbsp;300&nbsp;&&&nbsp;response.statusCode&nbsp;<&nbsp;400&nbsp;&&&nbsp;response.headers['location'])&nbsp;{&nbsp;/*&nbsp;retry&nbsp;the&nbsp;http&nbsp;request&nbsp;at&nbsp;the&nbsp;location&nbsp;*/&nbsp;}
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答