如何在 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'
  }
};