【问题标题】:Updating Yaml File through Patch method not working通过 Patch 方法更新 Yaml 文件不起作用
【发布时间】:2021-06-21 02:58:00
【问题描述】:

我有一个这种格式的 Yaml 文件(layouts.yaml),我想通过 REST Api 执行 crud 操作:

Layouts:
        -
          Name: Default Layout
          LayoutId : 1
          ConfiguredSegments:
            LiveA :
                Height : 100
                Id : LiveA
            Ref1A :
                Height : 100
                Id : Ref1A
    

我的控制器函数根据布局 ID 更新布局(我尝试了 2 种不起作用的方法):

第一种方式://这似乎不起作用

const raw = fs.readFileSync("layouts.yaml", 'utf8');
    const layoutData = YAML.load(raw);
    //function to update specific layout based on LayoutId
    export const updateSpecificLayout = (req, res)=>{
        const { id } = req.params;
        const { ConfiguredSegments } = req.body;
    
        const getLayoutList = JSON.parse(JSON.stringify(layoutData)); 
        
        getLayoutList.forEach(element => {if(element.LayoutId == id) element.ConfiguredSegments = 
        ConfiguredSegments 
            
        });
        let yaml = YAML.dump(getLayoutList);
         
          fs.writeFileSync("layouts.yaml", yaml, function (err,file){
             if(err) throw err;        
             console.log(`Layout with the id:${id} has been updated`);
      })      
    }
    

第二种方式://这似乎也不起作用

    const raw = fs.readFileSync("layouts.yaml", 'utf8');
    const layoutData = YAML.load(raw);
    //function to update specific layout based on LayoutId
    export const updateSpecificLayout = (req, res)=>{
        const { id } = req.params;
        const { ConfiguredSegments } = req.body;
    
        const getLayout = JSON.parse(JSON.stringify(layoutData)); 
        const foundLayout = getLayout.Layouts.find((layout) => layout.LayoutId == id);
    
        if(ConfiguredSegments)foundLayout.ConfiguredSegments = ConfiguredSegments;
        console.log(`Layout with the id:${id} has been updated`);
    }

    

通过 Postman,我正在使用带有以下正文的补丁请求测试我的 api:

    {
    "ConfiguredSegments": {
    "Ref2A": {
    "Height": 100,
    "Id": "LiveA"
    },
    "Ref3A": {
    "Height": 100,
    "Id": "Ref1A"
    }
    }
    }
    
 But the yaml file is not getting updated.Any other ways to achieve this ?

【问题讨论】:

    标签: javascript node.js yaml


    【解决方案1】:

    您可以尝试使用此方法。 定义一个能够找到并替换您正在寻找的对象的函数。 您的控制器功能:

    export const updateSpecificLayout = (req, res)=>{
        const { id } = req.params;
        const { ConfiguredSegments } = req.body;
    
        const getLayoutList = JSON.parse(JSON.stringify(layoutData)); 
    
        const layoutToBeUpdated = getLayoutList.Layouts.find((layout) => layout.LayoutId == id );
    
        findAndReplace(getLayoutList.Layouts,layoutToBeUpdated.ConfiguredSegments,ConfiguredSegments)
    
          let yaml = YAML.dump(getLayoutList);
         
           fs.writeFileSync("layouts.yaml", yaml, function (err,file){
              if(err) throw err;        
              console.log(`Layout with the id:${id} has been updated`);
      })      
    }
    

    查找和替换数据的辅助函数。

    // Helper function to update layout data
    function findAndReplace(object, value, replacevalue) {
        for (var x in object) {
          if (object.hasOwnProperty(x)) {
            if (typeof object[x] == 'object') {
              findAndReplace(object[x], value, replacevalue);
            }
            if (object[x] == value) { 
              object["ConfiguredSegments"] = replacevalue;
               break; 
            }
          }
        }
      }
    

    【讨论】:

    • 这对我有用。恰到好处。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-27
    • 1970-01-01
    • 2017-10-01
    • 2017-02-16
    • 1970-01-01
    • 2014-02-20
    • 2019-02-22
    相关资源
    最近更新 更多