如何在Promise‘then’子句中执行复杂逻辑?请求-承诺语法本身似乎有问题



我正在使用node.js运行我的javascript代码,并使用请求承诺库生成返回json blob的https请求。到目前为止,我已经成功地正确发送了请求,并且在响应中收到了所需的json对象,但我只看到了键,而没有看到值。我想提取一个名为";call_count";。我面临的问题是请求承诺语法的特殊结构,这似乎阻止了我做我想做的事情。

以下是当我在Postman:中运行查询时JSON响应的样子

{
"metric_data": {
"from": "2021-12-12T23:56:12+00:00",
"to": "2021-12-13T00:26:12+00:00",
"metrics_not_found": [],
"metrics_found": [
"Mobile/Crash/All"
],
"metrics": [
{
"name": "Mobile/Crash/All",
"timeslices": [
{
"from": "2021-12-12T23:53:00+00:00",
"to": "2021-12-13T00:23:00+00:00",
"values": {
"call_count": 0
}
}
]
}
]
}
}

这是我生成请求的代码:

const rp = require ('request-promise');
let options = {
method: 'GET',
uri: 'https://api.crashCatcher.com/v2/mobile_applications/myAppID/metrics/data.json?names=Mobile/Crash/All&values[]=call_count&summarize=true',
headers: {
'User-Agent': 'request-promise',
'X-Api-Key': 'MY API key goes here'
},
json: true // Automatically parses the JSON string in the response
};
rp(options).then(body => console.log(body)).catch(err => console.log(err.name, err.statusCode));

目前,当我运行此代码时,我得到的是:

{ metric_data: 
{ from: '2021-12-13T00:22:04+00:00',
to: '2021-12-13T00:52:04+00:00',
metrics_not_found: [],
metrics_found: [ 'Mobile/Crash/All' ],
metrics: [ [Object] ] } }

现在,我知道我要取回一个JSON对象,我知道需要做一些事情,比如:

var myJson = JSON.parse(*body*);

然后类似于:

console.log(myJson.metric_data.metrics[0].timeslices[0].values.call_count);

但是,当使用请求承诺语法时,我不知道如何将响应正文中返回的内容正确分配给一个变量,然后我可以对该变量进行JSON.parse并从中提取所需的call_count值。

您不限于使用箭头函数,甚至箭头函数也可以具有完整的函数体。

例如:

rp(options).then(
body => {
let myJson = JSON.parse(body);
console.log(myJson.metric_data.metrics[0].timeslices[0].values.call_count);
}
).catch(err => console.log(err.name, err.statusCode));

或:

rp(options).then(
function (body) {
let myJson = JSON.parse(body)
console.log(myJson.metric_data.metrics[0].timeslices[0].values.call_count)
}
).catch(err => console.log(err.name, err.statusCode));

甚至:

function handleResponse (body) {
let myJson = JSON.parse(body)
console.log(myJson.metric_data.metrics[0].timeslices[0].values.call_count)
}
rp(options).then(handleResponse).catch(err => console.log(err.name, err.statusCode));

甚至:

const handleResponse = body => {
let myJson = JSON.parse(body);
console.log(myJson.metric_data.metrics[0].timeslices[0].values.call_count);
}
rp(options).then(handleResponse).catch(err => console.log(err.name, err.statusCode));

因此,解决方案是删除我的选项中的json: true设置。一旦完成,Inigo列出的所有解决方案都有效!再次感谢您的帮助!这是一次巨大的学习经历。

let options = {
method: 'GET',
uri: 'https://api.crashCatcher.com/v2/mobile_applications/960867101/metrics/data.json?names=Mobile/Crash/All&values[]=call_count&summarize=true',
headers: {
'User-Agent': 'request-promise',
'X-Api-Key': 'My API key'
}
};

最新更新