Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js中未定义fetch not working结果_Node.js_Aws Lambda_Aws Cloud9_Node Fetch - Fatal编程技术网

Node.js中未定义fetch not working结果

Node.js中未定义fetch not working结果,node.js,aws-lambda,aws-cloud9,node-fetch,Node.js,Aws Lambda,Aws Cloud9,Node Fetch,我正在运行一个webhook来从seller.tools api中提取和处理数据 我正在尝试使用节点fetch通过fetch调用他们的api。当我在Cloud9IDE中测试它时,为了将它传输到aws lambda,无论如何我都会尝试获取结果,结果是它没有定义 事实上,如果我尝试调用中的控制台.log,那么它甚至不会显示。此外,它甚至不会抛出错误,除非我尝试进一步访问结果 ... var order, status; let url='https://data.seller.tools/api/v

我正在运行一个webhook来从seller.tools api中提取和处理数据

我正在尝试使用节点fetch通过fetch调用他们的api。当我在Cloud9IDE中测试它时,为了将它传输到aws lambda,无论如何我都会尝试获取结果,结果是它没有定义

事实上,如果我尝试调用
中的
控制台.log
,那么它甚至不会显示。此外,它甚至不会抛出错误,除非我尝试进一步访问结果

...
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和标题,在TalendAPI测试扩展中,它可以正常工作。但是在我的代码中,在Cloud9IDE中运行测试时,它没有。
发生了什么?

您应该在然后方法中进行日志记录,因为调用是异步的,日志记录将在调用解析之前进行


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)
}


我通过使包装函数异步并使用wait来确保提取同步进行,从而成功地从fetch获得响应

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;
    }
//...
}
日志:


不幸的是,这意味着有一个连锁反应,现在包装器函数异步工作并返回一个承诺。下一步是如何阻止这种波动

我猜是授权密钥的格式。请注意,3xx-5xx响应并非例外,因此您可能会得到一些回复,但由于授权失败,因此没有响应。在node fetch npm站点上,有一组关于如何检查状态错误的说明。“处理客户端和服务器错误”-尝试一下。最后一个console.log语句都将是未定义的,因为您正在进行异步调用。在fetch返回任何内容之前,您将点击console.log语句。那么,如何让脚本在继续之前等待响应呢?欢迎来到异步Javascript世界!要么在异步函数中等待结果,要么需要开始链接承诺调用。状态和状态文本是什么?我想我是在通过
链接承诺调用。然后
。我需要这个函数同步工作,以便我可以继续脚本。一切都取决于这个获取。日志记录并没有那么重要(尽管它告诉我变量在哪里)。我试图做的是访问脚本其余部分中的响应。我想在继续之前等待收到结果。根据我的发现,没有办法停止这个“异步/等待周期”。如果有人能找到解决办法,我将非常感谢你的帮助。
Order: {/*good order info here*/}
Status: 200