Элементы не могут быть добавлены в массив

#javascript #express

Вопрос:

Я пытаюсь получить данные из базы данных, используя метод обратного вызова «getAllOrdersByUserId». Результаты этого ниже:

 [ TextRow {
    DishOrderId: 163,
    BagId: 'BPZDXT68148',
    DateCreated: 2021-05-27T03:55:05.000Z,
    Bags:
     '[{"DishId":43,"DishName":"Kuchvi Biryani","Spicy":2,"UnitPrice":"6.99","Qty":5,"DishTotal":"34.95"}]',
    },
  TextRow {
    DishOrderId: 162,
    BagId: 'BNJENZ08608',
    DateCreated: 2021-05-27T03:46:26.000Z,
    Bags:
     '[{"DishId":41,"DishName":"Dum Biryani","Spicy":2,"UnitPrice":"6.99","Qty":5,"DishTotal":"34.95"}, {"DishId":42,"DishName":"Tysoon Biryani","Spicy":2,"UnitPrice":"6.99","Qty":5,"DishTotal":"34.95"}',
    } ]
 

Я пытаюсь извлечь несколько атрибутов из вышеперечисленного вместе с «Сумками». Но одна важная вещь, которую я хотел получить, — это URL-адрес для изображения блюд, который не указан в «Сумках», поэтому я анализирую «Сумки» и запускаю цикл, чтобы получить «DishId», который будет использоваться для получения URL-адресов изображений из другого метода с именем обратного вызова getDishesByDishIds. Принесенные тарелки находятся ниже:

 [43]

[41, 42]
 

Метод getDIshesByDishIds будет получать следующие результаты для указанных выше идентификаторов блюд при выполнении циклов for:

 [ TextRow {
    DishId: 43,
   
    DishImageUrl1:
     'http://192.168.86.104:1111/images/dishImageUrl1_1602546024189.JPG'
 } ]

 [ TextRow {
    DishId: 41,
    DishImageUrl1:
     'http://192.168.86.104:1111/images/dishImageUrl1_1602546024190.JPG'
 },
  TextRow {
    DishId: 42,
    DishImageUrl1:
     'http://192.168.86.104:1111/images/dishImageUrl1_1602546024191.JPG'
} ]
 

Реальная проблема, с которой я сталкиваюсь, заключается в том, что я не получаю точного результата, как показано ниже. Основная проблема , с которой я сталкиваюсь, заключается в том, что, хотя я могу получить URL-адрес для блюд, я не могу добавить URL-адреса в конечный результат, как показано ниже:

 {
    "success": 1,
    "bag": [
        {
            "DishOrderId": 163,
            "BagId": "BPZDXT68148",
            "DateCreated": "2021-05-27T03:55:05.000Z",
            "Bags": [
                {
                    "DishId": 43,
                    "DishName": "Kuchvi Biryani",
                    "Spicy": 2,
                    "UnitPrice": "6.99",
                    "Qty": 5,
                    "DishTotal": "34.95"
                }
            ],
            "Url": ['http://192.168.86.104:1111/images/dishImageUrl1_1602546024189.JPG']
        },
        {
            "DishOrderId": 162,
            "BagId": "BNJENZ08608",
            "DateCreated": "2021-05-27T03:46:26.000Z",
            "Bags": [
                {
                    "DishId": 41,
                    "DishName": "Dum Biryani",
                    "Spicy": 2,
                    "UnitPrice": "6.99",
                    "Qty": 5,
                    "DishTotal": "34.95"
                },
                {
                    "DishId": 42,
                    "DishName": "Tysoon Biryani",
                    "Spicy": 2,
                    "UnitPrice": "6.99",
                    "Qty": 5,
                    "DishTotal": "34.95"
                }
            ],
            "Url": ['http://192.168.86.104:1111/images/dishImageUrl1_1602546024190.JPG',
                    'http://192.168.86.104:1111/images/dishImageUrl1_1602546024191.JPG']
        }
    ]
}
 

Полный код указан ниже:

  myOrders: (req, res) => {
    const userId = req.body.userId;
    orderStatus = 2;
    getAllOrdersByUserId(userId, orderStatus, (error, results) => {
      if (error) {
        console.log(error);
        return res.status(500).json({
          success: 0,
          message: "Some other error",
          error: error,
        });
      }
      if (!results) {
        return res.status(404).json({
          success: 0,
          message: "Record not found",
        });
      } else{
        const myOrderArray = []; //this will be new array to store all details including dish Urls
        console.log(results);
        count = 0;
      for (i = 0; i < results.length; i  ) { 
        const myOrder = {}
        myOrder.DishOrderId = results[i].DishOrderId;
        myOrder.BagId = results[i].BagId;
        myOrder.DateCreated = results[i].DateCreated;
        myOrder.Bags = JSON.parse(results[i].Bags);
        myOrderArray.push(myOrder);

        OrderDishes = JSON.parse(results[i].Bags);
        //for each one of dish in order dishes get the dish id
        let dishId = []
        DishUrls = [];
        countz = 0;
        for (j = 0; j < OrderDishes.length; j  ) {
          dishId.push(OrderDishes[j].DishId);

                  //fetch image url for the dish Id fetched
                  //DishUrls = [];
                  getDishesByDishIds(dishId, (error, getDishesByDishIdsResults) => {
                    if (error) {
                      console.log(error);
                      return res.status(500).json({
                        success: 0,
                        message: "Some other error",
                        error: error,
                      });
                    }
                  
                  console.log(getDishesByDishIdsResults); 
                 // DishUrls = [];
                  count2 = 0;
                  for (l = 0; l < getDishesByDishIdsResults.length; l  ) {
                    count2  ;
                    if(getDishesByDishIdsResults[l].DishImageUrl1 == undefined){
                      if(count2 == getDishesByDishIdsResults.length){
                        //proceed with other steps
                        console.log(DishUrls);
                      }
                    }
                    else{
                      DishUrls.push(getDishesByDishIdsResults[l].DishImageUrl1);                      
                    }
                  }
                });

          countz   ;
          if(countz == OrderDishes.length){
            //do next step
             console.log(DishUrls);
             myOrder.Url = DishUrls; //not working  , coming incorrect
          }
        }   
      }
      
      return res.json({
        success: 1,
        bag: myOrderArray,
       });

      }
   
    });
  },
};
 

Извините за длинный пост, но я буду очень признателен всем, кто хотел мне помочь, потому что я застрял здесь уже несколько дней.

Комментарии:

1. можете ли вы удалить ненужный код?

2. Проблема в том, что DishImageUrl1 отсутствует во втором элементе массива (DishId 42) во втором ответе от getDIshesByDishIds ? Или это просто ошибка копирования/вставки?

3. На самом деле getDishesByDishIds работает асинхронно? Это отбросило бы весь цикл for… Вам нужно было бы сделать некоторые магические вещи с немедленным асинхронным обратным вызовом, чтобы это сработало…

4. @ryancdotnet , да, вы правы, это была опечатка, я это исправил. И я думаю, что вы правы, я хотел получить некоторые магические вещи с немедленным асинхронным обратным вызовом. Не могли бы вы, пожалуйста, помочь мне достичь этого?

5. @Skarlinski Я думаю, что нет никакого нерелевантного кода. Если я удалю некоторые из них, станет очень трудно понять, как работают петли.

Ответ №1:

Отказ от ответственности

Прости меня… Я написал это поздно вечером после и без того ДОЛГОГО рабочего дня…

Я не доверяю этому кодексу. Она непроверена и написана очень плохо. Вероятно, это не сработает.

Но…

Я надеюсь, что это, по крайней мере, приведет вас в правильном направлении.

Переработанный Код

 myOrders: (req, res) => {
    const userId = req.body.userId;
    let orderStatus = 2;

    getAllOrdersByUserId(userId, orderStatus, (error, results) => {
        if (error) {
            console.log(error);
            res.status(500).json({
                success: 0,
                message: "Some other error",
                error: error,
            });

            return;
        }

        if (!results) {
            res.status(404).json({
                success: 0,
                message: "Record not found",
            });

            return;
        }

        for (let i = 0; i < results.length; i  ) {
            
            (() => {
                let currentOrder = results[i];
                currentOrder.Bags = JSON.parse(currentOrder.Bags);

                return new Promise((resolve, reject) => {
                    let dishIds = [];

                    for (let j = 0; j < currentOrder.Bags.length; j  ) {
                        dishIds.push(currentOrder.Bags[j].DishId);
                    }

                    (() => {
                        return new Promise((innerResolve, innerReject) => {
                            getDishesByDishIds(dishIds, (error, getDishesByDishIdsResults) => {
                                let dishUrlResults = [];

                                if (error) {
                                    innerReject("An error occurred during retrieval of the dish image urls");
                                    return;
                                }
                
                                for (let l = 0; l < getDishesByDishIdsResults.length; l  ) {
                                    if (getDishesByDishIdsResults[l].DishImageUrl1 != undefined) {
                                        dishUrlResults.push(getDishesByDishIdsResults[l].DishImageUrl1);
                                    }
                                }

                                innerResolve(dishUrlResults);
                            });
                        });
                    })()
                    .then((urlResults) => {
                        currentOrder.Url = urlResults;
                        resolve();
                    })
                    .catch((innerPromiseError) => {
                        reject(innerPromiseError);
                    });
                });
            })()
            .then(() => {
                res.json({
                    success: 1,
                    bag: results,
                });
            })
            .catch((promiseError) => {
                //Could not complete the request
                console.log(promiseError);

                res.status(500).json({
                    success: 0,
                    message: "Some other error",
                    error: error,
                });
            });
        }
    });
}
 

Комментарии:

1. Я запустил ваш код, но я не вижу Url(2 URL) для второго заказа на блюдо. Можете ли вы посмотреть, сможете ли вы это исправить. На самом деле я также получил сообщение об ошибке необработанного отклонения обещания в своей консоли. Также изначально возникла ошибка «Не удается установить заголовки после их отправки клиенту».

2. Неважно, я смог это исправить, проведя подсчет во внешнем . затем заявление. И большое вам спасибо за то, что помогли мне в этом. Очень признателен.

3. Рад, что хотя бы приблизил тебя! Волшебная часть связана с закрытием и тем фактом, что вам нужно было вызвать асинхронную функцию внутри цикла for. Чтобы это сработало, вы должны обработать заключительную часть уравнения, используя немедленные вызовы функций, чтобы сначала немедленно разрешить значения, необходимые в цикле for. Затем вам нужно было обработать результаты, полученные в результате асинхронных вызовов fn, и отправить ответ обратно, когда это, наконец, будет уместно сделать. Читая мой код сейчас, я вижу, где я оставил несколько ошибок в логике, но, похоже, вы это поняли. 🙂