【问题标题】:How do I modify all occurrences of a property (including nested) in an object before sending a JSON response?如何在发送 JSON 响应之前修改对象中所有出现的属性(包括嵌套)?
【发布时间】:2020-10-16 02:27:30
【问题描述】:

我有一个通过解析一些 JSON 创建的对象。 JSON 数据如下所示:

  {
    "id": "fan",
    "name": "My super awesome fan",
    "image": "Icon.png",
    "details": {
      "parts": [
        {
          "name": "base",
          "image": "base.png"
        },
        {
          "name": "blades",
          "image": "blade.png"
        }
      ],
      "sale": {
        "value": "prime",
        "image": "PrimeDay.png"
      }
    }
  }

image 属性中的值指向位于“public”目录下的文件,该目录使用 express.static 提供服务。例如,blade.png 文件位于:

public
  --products
    --fan (this is the same as the id property)
      --blade.png

现在,当查询获取该对象的详细信息时,我想修改响应中发送的对象的图像属性,以便 JSON 响应如下所示:

  {
    "id": "fan",
    "name": "My super awesome fan",
    "image": "http://localhost:3000/products/fan/icon.png",
    "details": {
      "parts": [
        {
          "name": "base",
          "image": "http://localhost:3000/products/fan/base.png"
        },
        {
          "name": "blades",
          "image": "http://localhost:3000/products/fan/blade.png"
        }
      ],
      "sale": {
        "value": "prime",
        "image": "http://localhost:3000/products/fan/PrimeDay.png"
      }
    }
  }

  

我沿着使用 express 中间件的路径创建了一个指向 using 路径的 url

const url = req.protocol + '://' + req.get('host')

如何使用这个url 值来修改响应对象? 我不想将完整的本地主机路径硬编码到 JSON 中的图像,因为在部署时路径可能会改变。

【问题讨论】:

    标签: node.js express


    【解决方案1】:

    我能够解决这个问题,部分是使用 Charly 的解决方案。我不能完全使用它的唯一原因是因为 URL 的 fan 部分也是动态的,并且依赖于 JSON 数据中的 id 属性。

    这是我的方法:

    setImagePaths = (data) => {
        const baseUrl = 'http://localhost:3000/products/'
        const baseId = data.id;
    
        const patchImagePaths = (obj) => {
            Object.keys(obj).forEach(key => {
                if (typeof obj[key] === 'object') {
                    return patchImagePaths(obj[key]);
                }
                if (key === 'image') {
                    obj[key] = baseUrl + baseId + '/' + obj[key];
                }
            });
        }
    
        patchImagePaths(data);
    }
    

    【讨论】:

      【解决方案2】:

      您可以使用递归函数修改您的响应对象以更新图像属性:

      var myObject =   {
        "id": "fan",
        "name": "My super awesome fan",
        "image": "Icon.png",
        "details": {
          "parts": [
            {
              "name": "base",
              "image": "base.png"
            },
            {
              "name": "blades",
              "image": "blade.png"
            }
          ],
          "sale": {
            "value": "prime",
            "image": "PrimeDay.png"
          }
        }
      }
      ;
      
      const url = "http://localhost:3000/products/fan/";
      //You can use here your url function with whatever output it has.
      
      function resetImages (obj) {
        Object.keys(obj).forEach(function (key) {
            if (Array.isArray(obj[key])) {
                let arr = obj[key];
                arr.map((i)=>{
                  return i.image = url+i.image;
                });
                return arr;
            }
            if (typeof obj[key] === 'object') {
                return resetImages(obj[key]);
            }
            if(key==="image") {
              obj[key]=url+obj[key];
            }
        });
      }
      
      
      
      
      resetImages(myObject);
      console.log(JSON.stringify(myObject));
      
      **Output:**
      
      {"id":"fan","name":"My super awesome fan","image":"http://localhost:3000/products/fan/Icon.png","details":{"parts":[{"name":"base","image":"http://localhost:3000/products/fan/base.png"},{"name":"blades","image":"http://localhost:3000/products/fan/blade.png"}],"sale":{"value":"prime","image":"http://localhost:3000/products/fan/PrimeDay.png"}}}
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-19
        • 1970-01-01
        • 2021-10-27
        • 2021-02-23
        • 2021-01-02
        相关资源
        最近更新 更多