получить не работает результат не определен в Node.js - PullRequest
0 голосов
/ 11 марта 2020

Я использую веб-крючок для извлечения и обработки данных из API Seller.tools.

Я пытаюсь вызвать их API с помощью fetch, используя node-fetch. Когда я тестирую его в cloud9 ide, чтобы перенести его в aws -lambda, я в любом случае пытаюсь получить результат, который получился неопределенным.

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

...
var order, status;
let url='https://data.seller.tools/api/v1/orders/'+orderid;
let options={
  headers:{
    'Authorization':apikey
  }
};

try{
  fetch(url,options)
  .then(res => {status=res.status;order=res.json();return res;})
  .then(res => console.log(res))
  .catch(err => console.error("Err"+err));
}catch(err){console.log(err)}
console.log("order: "+order);
console.log("status: "+status);
console.log(order.order_id);
...

Результат:

order: undefined 
status: undefined
{"errorType":"TypeError","errorMessage":"Cannot read property 'order_id' of undefined"}

Я использовал те же URL и заголовки , в расширении talend api tester, работает как надо. но в моем коде, при запуске теста в cloud9 ide, это не так. Что происходит?

Ответы [ 2 ]

0 голосов
/ 12 марта 2020

Мне удалось получить ответ от fetch, сделав мою функцию переноса asyn c и используя await, чтобы убедиться, что выборка происходит синхронно.

async function loadJson(url,options) { 
  let response = await fetch(url,options);
  if (response.status == 200) {
    let json = await response.json();
    return {'status':response.status,'json':json};
  }

  throw new Error(response.status);
}
async function getOrder(orderid) {
//...
var order, status;
let url='https://data.seller.tools/api/v1/orders/'+orderid;
let options={
  headers:{
    'Authorization':apikey
  }
};

try{
        var response;

        await loadJson(url,options)
        .then(res => response=res)
        .catch(err => console.log(err)); // Error: 404
        var json = response.json;
        console.log('Order:' + JSON.stringify(json));
        var status=response.status;
        console.log('Status:'+status);
    }catch(err){
        console.log(err);
        return err;
    }
//...
}

Log:

Order: {/*good order info here*/}
Status: 200

к сожалению, это означает, что существует волновой эффект, что теперь функция-оболочка работает асинхронно и возвращает обещание. Следующий шаг - как остановить эту рябь.

0 голосов
/ 11 марта 2020

Вы должны войти в метод , а затем , поскольку вызов асинхронный c, и запись будет происходить до его разрешения.


var order, status;
let url = 'https://data.seller.tools/api/v1/orders/' + orderid;
let options = {
  headers: {
    'Authorization': apikey
  }
};

try {
  fetch(url, options)
    .then(res => {
      status = res.status;
      order = res.json();
      console.log("order: " + order);
      console.log("status: " + status);
      console.log(order.order_id);

      return res;
    })
    .catch(err => console.error("Err" + err));
} catch (err) {
  console.log(err)
}

...