Мне нужно создать массив с этой структурой:

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

Итак, у меня есть форма, где я выбираю нужные части и отправляю семьи, чтобы получить URL. В функции получения я делаю для получения статей каждой семьи, и я хочу запросить выбор статей и выбор позиций , После этого я пытаюсь поместить каждый массив в основной, но не могу показать мне неопределенное. Как я могу сделать этот вид операций?

Я новичок в ноде и экспрессе, и это первый раз, когда я должен это сделать.

Мой код:

 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"]
  }
]

Пожалуйста, научите меня, как я могу делать такие операции.

Спасибо

0
user3242861 11 Янв 2017 в 13:55

3 ответа

Лучший ответ
  • Не уверен, почему вы передаете 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);
  });
};
1
Guig 11 Янв 2017 в 15:04

Вы неправильно используете 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
cevek 11 Янв 2017 в 11:11

Promise.all() принимает массив обещаний, похоже, что вы передаете несколько массивов.

-1
Matt Altepeter 11 Янв 2017 в 11:09