【问题标题】:Javascript how to put xml2js into a functionJavascript如何将xml2js放入函数中
【发布时间】:2018-08-17 05:16:39
【问题描述】:

我正在尝试导出一个将 xml 解析为 json 对象的函数。

export const parse = (body) => {
  const parser = new xml2js.Parser({explicitArray: false, trim: true});
  parser.parseString(body, (err, result) => {
    if (err) return err;
    parser.parseString(result['soapenv:Envelope']['soapenv:Body']['ns1:searchResponse'].searchReturn._, (err, result) => {
      if (err) return err;
      console.log(result);
      return result;
    });
  });
}

我遇到的问题是该函数返回未定义,但是,它设法 console.log 正确的结果。

【问题讨论】:

    标签: javascript node.js xml2js


    【解决方案1】:

    由于您的函数是异步的,您可以将其转换为 Promise。

    export const parse = (body) => {
    
    return new Promise((resolve, reject) => {
    
      const parser = new xml2js.Parser({explicitArray: false, trim: true});
      parser.parseString(body, (err, result) => {
        if (err) return reject(err);
        parser.parseString(result['soapenv:Envelope']['soapenv:Body']['ns1:searchResponse'].searchReturn._, (err, result) => {
          if (err) return reject(err);
          resolve(result);
        });
      });
      }
    
    
    })
    

    你可以这样使用它..

    const result = await parse(<somebody>)
    

    【讨论】:

    • 我相信你的意思是return resolve(result)。但除此之外,它还有效。
    • 不,您不必返回它,resolve 将返回该值,我将 returnreject 一起使用,因此该函数不再执行
    【解决方案2】:

    解析器是异步的,因此您需要使用回调或承诺来解决这一问题。

    const parser = new xml2js.Parser({explicitArray: false, trim: true});
    
    export const parse = (body) => new Promise((resolve, reject) => {
    
      parser.parseString(body, (err, result) => {
        if(err) return reject(err);
    
        return resolve(result);    
      });
    });
    

    用法。

    module.parse(xml).then((parsedResult) => {
    
    });
    

    【讨论】:

    • 或者如下所述使用我们可以使用const result = await parse(&lt;somebody&gt;)
    猜你喜欢
    • 2014-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多