Mailchimp API возвращает большой объект gzip при использовании node-fetch вместо json

#node.js #rest #fetch #mailchimp-api-v3.0

#node.js #остальное #извлечение #mailchimp-api-v3.0

Вопрос:

Я пытаюсь вернуть список измененных элементов из mailchimp API, который возвращает следующий (правильный) json, если я использую curl / Postman:

 {
  "members": [
    {
      "id": "187fhdy650b10e8d43552b6c3672368212",
      "email_address": "example@email.co.uk",
      "unique_email_id": "2edbhgy73836",
      "email_type": "html",
      "status": "unsubscribed",
      "merge_fields": {
        "FNAME": "",
        "LNAME": "",
        "MMERGE5": "",
        //etc....
  

Я хочу вернуть этот объект с помощью приложения Node, поэтому использую node-fetch следующим образом:

 fetch(`https://us5.api.mailchimp.com/3.0/lists/<listid>/members?since_last_changed=2016-10-18T23:10:18 00:00`, {headers: authHeader})
  .then((response) => {
    if (response.ok) {
      res.status(response.status).send(response)
    } else {
      res.status(response.status).send(response)
    }
  }).catch((error) => {
      res.status(500).send(error.message)
  })})
  

Это возвращает совершенно другую структуру json, которая, на мой взгляд, предполагает, что она находится на полпути к получению данных, и обещание выборки не должно было быть выполнено. Он довольно большой, поэтому я включаю то, что считаю ключевыми битами информации:

 {
  "_opts": {},
  "_chunkSize": 16384,
  "_readableState": {
"objectMode": false,
"highWaterMark": 16384,
"buffer": [],
"length": 0,
"pipes": null,
"pipesCount": 0,
"flowing": null,
"ended": false,
"endEmitted": false,
"reading": false,
"sync": false,
"needReadable": true,
"emittedReadable": false,
"readableListening": false,
"resumeScheduled": false,
"defaultEncoding": "utf8",
"ranOut": false,
"awaitDrain": 0,
"readingMore": false,
"decoder": null,
"encoding": null
},
"readable": true,
"domain": null,
"_events": {
"end": [
  null,
  null
]
},
"_eventsCount": 7,
"_writableState": {
  "objectMode": false,
  "highWaterMark": 16384,
  "needDrain": false,
  "ending": true,
  "ended": true,
  "finished": false,
  "decodeStrings": true,
  "defaultEncoding": "utf8",
  "length": 2674,
  "writing": true,
  "corked": 0,
  "sync": false,
  "bufferProcessing": false,
  "writelen": 2674,
  "bufferedRequest": null,
  "lastBufferedRequest": null,
  "pendingcb": 1,
  "prefinished": false,
  "errorEmitted": false,
  "bufferedRequestCount": 0,
  "corkedRequestsFree": {
  "next": null,
  "entry": null
  }
},
"writable": false,
"allowHalfOpen": true,
"_transformState": {
 "needTransform": false,
 "transforming": true,
 "writechunk": {
  "type": "Buffer",
  "data": [
    31,
    139,
    8,
    0,
    0,
    0,
    0,
    0,
    198,....
  

Я пытался проанализировать это по-разному, например, сначала прочитать ответ:

 .then((response) => {
  response.text()})
.then((response) => {
  res.status(200).send(response)
})
  

который возвращает неопределенный объект. А также синтаксический анализ как json:

 .then((response) => {
  res.status(200).send(response.json())
})
  

который возвращает пустой объект {}

Есть ли что-нибудь еще, что я могу попробовать с моим вызовом fetch?

Ответ №1:

fetch() возвращает обещание, которое преобразуется в объект ответа, который, в свою очередь, имеет различные методы ( .text() , .json() ), которые возвращают обещания, которые преобразуются в тело ответа.

Итак, попробуйте это:

 fetch(`https://us5.api.mailchimp.com/3.0/lists/<listid>/members?since_last_changed=2016-10-18T23:10:18 00:00`, {headers: authHeader})
  .then(response => {
    res.status(response.status);
    return response.json();
  }).then(body => {
    res.send(body);
  }).catch(error => {
    res.status(500).send(error.message)
  });