如何在 Promise `then` 子句中执行复杂的逻辑?请求承诺语法本身似乎有问题
How to do complex logic in a Promise `then` clause? The request-promise syntax itself appears problematic
我运行使用 node.js 编写我的 javascript 代码,并使用 request-promise 库生成 https 请求return 一个 json 斑点。到目前为止,我已经设法正确发送了请求——而且我确实在响应中收到了所需的 json 对象,但我只看到了键,没有看到值。我想提取名为“call_count”的键的值。我面临的问题是 request-promise 语法的特殊结构,它似乎在阻止我做我想做的事。
这是我在 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);
但是在使用 request-promise 语法时,我不知道如何正确分配响应中返回的内容 body到一个变量,然后我可以 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'
}
};
我运行使用 node.js 编写我的 javascript 代码,并使用 request-promise 库生成 https 请求return 一个 json 斑点。到目前为止,我已经设法正确发送了请求——而且我确实在响应中收到了所需的 json 对象,但我只看到了键,没有看到值。我想提取名为“call_count”的键的值。我面临的问题是 request-promise 语法的特殊结构,它似乎在阻止我做我想做的事。
这是我在 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);
但是在使用 request-promise 语法时,我不知道如何正确分配响应中返回的内容 body到一个变量,然后我可以 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'
}
};