Node js - 如何返回多维数组

时间:2017-01-11 10:55:22

标签: javascript arrays node.js express

我需要创建一个具有以下结构的数组:

[
 { 
   position: 2,
   family: 9404,
   part: [ 'article1', 'article2', 'article3' ]
 },
 {
   position: 3,
   family: 9405,
   part: [ 'article4', 'article5', 'article6' ] 
  }
]

所以我有一个表格,我选择我想要的部分,并发送家庭获取网址。在getter功能,我做一个获取每个家庭的文章,我想查询一些文章和一个选择职位。之后,我尝试将每个阵列推送到主阵列,但我不能,显示未定义。我该怎么做这种操作?

我是node和express的新手,这是我第一次这样做。

我的代码:

 getFamilies(req, res)
  {
    console.log(req.params.data);
    var parsedData = JSON.parse(req.params.data);
    var compounds = parsedData[0].compounds;
    var supplier = parsedData[0].supplier;
    var families = parsedData[0].families;
    console.log(parsedData[0].compounds.length);

    var position = [];

    var data = [];
    var parts = [];
    for (var i = 0; i < compounds.length; i++)
    {
      parts.push(request.query("SELECT st.ref, st.design FROM st WHERE familia ='"+families[i]+"'"));
      position.push(request.query("SELECT u_order FROM u_part WHERE u_familia='"+families[i]+"'"));
    }

    return Promise.all(parts, position, families).then(function(listOfResults)
    {
      //add parts, position and families to data[]
      var data = [];

      //console.log(data);
      console.log(listOfResults);
      console.log("done");
      //return listOfResults;
      res.render('view2', {teste: data});
    }).catch(function(err)
    {
        // ... query error checks
        console.log(err);
    });
  }

在承诺中只打印第一个参数“parts”,如果我把[parts, position, families]给我承诺待定。 我如何将数据放在我上面显示的结构中。

parseData:

[
 {
   "compounds": ["8"],
   "supplier": ["sup"],
   "families": ["9305"]
  }
]

请教我如何进行此类操作。

谢谢

3 个答案:

答案 0 :(得分:1)

你错误地使用Promise.all,它需要一系列承诺

return Promise.all([Promise.all(parts), Promise.all(position)]).then(function(listOfResults){
  var partResult = listOfResults[0];
  var positionResult = listOfResults[1];
  var data = [];
  for (var i=0; i<families.length; i++) {
     var family = families[i];
     var pos = positionResult[i];
     var parts = partResult; // logic to extract parts for current family
     data.push({family: family, position: pos, parts: parts})
  }
  console.log(data);
})

答案 1 :(得分:1)

  • 不确定您将families传递给Promise.all families的原因似乎只是来自查询的数据数组
  • Promise.all在输入中获取一系列承诺,并且您传递了一系列承诺和数据数组...
  • 你永远不应该像这样构建SQL查询。这是SQL注入的一个重大缺陷(但这是另一个问题)

所以:

Promise.all([...parts, ...position])或者如果您不使用ES6语法Promise.all(parts.concat(position))

并修复你的SQL!

====

最终代码可能如下:

getFamilies = (req, res) => {
  var families = JSON.parse(req.params.data)[0].families;

  var positions = [];

  var data = [];
  var parts = [];
  families.forEach(family => {
    // see http://stackoverflow.com/a/7760578/2054629 for mysql_real_escape_string
    parts.push(request.query("SELECT st.ref, st.design FROM st WHERE familia ='"+mysql_real_escape_string(family)+"'"));
    positions.push(request.query("SELECT u_order FROM u_part WHERE u_familia='"+mysql_real_escape_string(family)+"'"));
  });

  return Promise.all([Promise.all(parts), Promise.all(positions)]).then(listOfResults => {
    var [partResult, positionResult] = listOfResults;

    var data = families.map((family, i) => {
      var pos = positionResult[i];
      var parts = partResult[i];
      return {family: family, position: pos, parts: parts};
    });
    res.render('view2', {teste: data});
  }).catch(err => {
      // ... query error checks
      console.log(err);
  });
};

答案 2 :(得分:-1)

Promise.all()接受一系列承诺,看起来你正在传递多个数组。