Node.js中未定义fetch not working结果
我正在运行一个webhook来从seller.tools api中提取和处理数据 我正在尝试使用节点fetch通过fetch调用他们的api。当我在Cloud9IDE中测试它时,为了将它传输到aws lambda,无论如何我都会尝试获取结果,结果是它没有定义 事实上,如果我尝试调用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
中的控制台.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