【问题标题】:Unable to iterate the response body and manipulate/filter the response object using node JS无法使用节点 JS 迭代响应主体和操作/过滤响应对象
【发布时间】:2019-11-30 02:58:50
【问题描述】:

我有下面的代码将调用 REST 端点并返回响应。我只是尝试在控制台中打印 response.body 并且效果很好。

 var express = require('express');
 var app = express();
 var PORT = 8001;
 var request = require('request');
 var HashMap = require('hashmap');

   var endPoint="http://sandbox.dev.amazon.com/idsearch/environment/amazon/";

   app.get('/productId/:proId',async (req,res) => {  
     try
     {
          var headers ={
              "accept":"application/json"
          }

          var options = {
             url:endPoint.concat(req.params.proId),
             headers:headers
          }

          request(options, (error,response,body)=> {
          console.log(response.body)  // It returned response as below output JSON file
          res.send("STATUS CODE : 200");

        });

     }
     catch(error)
     {
        throw error;
     }
  });

输出:

{
    "<Some dynamic Content>": {
        "type": "PROD-ID",
        "environment": "amazon",
        "tags": [
            {
                "name": "EC-6S0005704A8324S98020",
                "source": "amazonstage2ma_paymentapiplatserv#TOKEN",
                "flags": [
                    "FLAG_DYNAMIC_VALUE",
                    "FLAG_ID_LOOKUP_SUPPORTED"
                ]
            }
        ],
        "callSummary": [
            {
                "pool": "slingshotrouter",
                "machine": "stage21007",
                "apiName": "GET",
                "status": "0",
                "duration": 13400.0,
                "link": "https://www.amazon.qa.pilot.com/Tid-942342192424j2j234"
            },
            {
                "pool": "slingshot",
                "machine": "stage21029",
                "apiName": "GET",
                "status": "1",
                "duration": 13368.0,
                "link": "https://www.amazon.qa.pilot.com/Tid-12342342i842424j2j234"
            },


            {
                "pool": "devstage_userbridgedomainserv",
                "machine": "amazon1int-g_userbridgedomainserv_22",
                "apiName": "POST",
                "status": "1",
                "duration": 15.0,
                "link": "https://www.amazon.qa.pilot.com/Tid-02341723424i842424j2j290"
            }

        ],
        "partial": false
    }
}

上面的输出包含所有带有相应端点 URL 的响应,这是预期的。但我只想获取包含“状态:1”的对象。我只是想知道如何操作 response.body 对象以获取以下 JSON 作为输出。

预期输出:

 {
  "callSummary":[

              {
                    "pool": "slingshot",
                    "machine": "stage21029",
                    "apiName": "GET",
                    "status": "1",
                    "duration": 13368.0,
                    "link": "https://www.amazon.qa.pilot.com/Tid-12342342i842424j2j234"
              },

              {
                    "pool": "devstage_userbridgedomainserv",
                    "machine": "amazon1int-g_userbridgedomainserv_22",
                    "apiName": "POST",
                    "status": "1",
                    "duration": 15.0,
                    "link": "https://www.amazon.qa.pilot.com/Tid-02341723424i842424j2j290"
               }

             ]
        }

我只想迭代 response.body obj 并检查状态是否为 1,如果是,那么我需要获取所有详细信息并将其形成为上述有效负载。这是动态内容,但模板格式是静态的。

我尝试了下面的代码来迭代 response.body 但没有运气。

    var string = JSON.stringify(response.body);
    var objectValue = JSON.parse(string);
    var obj = objectValue.callSummary;
    console.log(obj.length);  // It returned undefined.

请带领我实现这一目标。

【问题讨论】:

  • 你的问题是callSummary不是body中JSON对象的顶级key。 “”是。您需要访问objectValue["&lt;Some dynamic Content&gt;"].callSummary
  • 它没有用。我试过它返回未定义。

标签: javascript node.js express node-request


【解决方案1】:

要返回该 json,只需

res.json(response.body['<Some dynamic Content>'].callSummary);

在发送响应之前添加一些验证和错误处理是个好主意。

如果您的键只是一个示例,而您永远不知道您的第一个键值,并且您总是想要第一个键的值

res.json(Object.values(response.body)[0].callSummary);

Object.values 返回一个数组,所以如果你想管理比第一个更多的值,你可以迭代这些值

【讨论】:

  • console.log(response.body['61705d3f91330'].callSummary); ^ 类型错误:无法读取未定义的属性“callSummary”
  • 当我使用 let value = Object.value(response.body)[0].callsummary.length;返回未定义。
  • 如何迭代 JSON 元素?你能帮我解决这个问题吗?
  • Object.entries(obj).forEach( ([key, value]) =&gt; console.log(key, value) ); 您的请求中也可能缺少此标头'content-type': 'application/json'
猜你喜欢
  • 1970-01-01
  • 2017-09-24
  • 2016-10-03
  • 2021-01-03
  • 2020-12-19
  • 2023-03-31
  • 2020-09-08
  • 2015-08-19
  • 2013-06-08
相关资源
最近更新 更多