Saya menggunakan node.js sebagai api untuk aplikasi saya. masalahnya ada di blok kode ini saya mengedit nilai array di dalam forEach loop tetapi ketika saya console.log() mereka saya masih mendapatkan array kosong. saya berpikir bahwa forEach loop dijalankan setelah console.log() di POSISI 2 dan setelah respons dikirim. dan sebagai catatan, di POSISI 1 saya mendapatkan nilai yang tepat seperti yang saya inginkan

Ini kodenya

router.post('/', (req, res, next) => {
    userId = req.body.userId;

    sqlQuery = `SELECT mealsids FROM tmporders WHERE userid = ${userId}`;

    con.query(sqlQuery, function (err, rows) {
        let mealsIds = [];
        let mealsNames = [];
        let mealsPrices = [];
        let mealsImages = [];
        var index = 0

        if (rows['rows'].length > 0) {
            mealsIds = rows['rows'];

            mealsIds[0]['mealsids'].forEach((row) => {

                sqlQuery2 = `SELECT name, image, price FROM meals WHERE id = ${mealsIds[0]['mealsids'][index]}`;

                con.query(sqlQuery2, function (err, rows) {
                    if (err) {
                        console.log('Failed BITCH');
                        res.sendStatus(202)
                    } else {
                        mealsNames.push(rows['rows'][0]['name']);
                        mealsPrices.push(rows['rows'][0]['price']);
                        mealsImages.push(rows['rows'][0]['image']);

                        /*   POSITION 1   */
                        console.log('============POSITION 1============');
                        console.log(mealsNames);
                        console.log(mealsPrices);
                        console.log(mealsImages);

                        /*  END OF POSITION 1   */
                    }
                });
            });

            /*   POSITION 2   */
            console.log('============POSITION 2============');
            console.log(mealsNames);
            console.log(mealsPrices);
            console.log(mealsImages);

            /*  END OF POSITION 2   */


            res.json({
                statusCode: 201,
                count: mealsNames.length,
                mealsIds: mealsIds,
                mealsNames: mealsNames,
                mealsImages: mealsImages,
                mealsPrices: mealsPrices
            })

        } else {
            console.error("Failure");
            console.log(err);
            res.sendStatus(202);
        }
    });
});

Apakah ada cara untuk memperbaiki kesalahan logis ini?

-2
Bakri Alkhateeb 30 Maret 2020, 01:27

1 menjawab

Jawaban Terbaik

Coba ini, ini dapat membuat kesalahan pada kode Anda, tetapi Anda tetap dapat mengembangkan kode Anda lebih baik dengan mengikuti pola ini.

const Query = conn => query => new Promise((resolve, reject) => {
  try {
    conn.query(query, (err, res) => {
      if (err) return reject(err)
      resolve(res.rows)
    })
  } catch (er) {
    reject(er)
  }
})

router.post('/', async (req, res, next) => {
  try {
    const query = Query(con);

    userId = req.body.userId;

    const rows = await query(`SELECT mealsids FROM tmporders WHERE userid = ${userId}`)

    if (!rows.length) {
      return res.status(202).json({
        message: '0 rows'
      })
    }

    console.log({ rows })

    mealsIds = rows.rows;

    console.log({ mealsIds })

    const meals = await mealsIds[0].mealsids.reduce((promise, e) => promise.then(async acc => {
      const currentResult = await query(`SELECT name, image, price FROM meals WHERE id = ${mealsIds[0].mealsids[0]}`)

      return acc.concat(currentResult[0])
    }), Promise.resolve([]))

    console.log({ meals })

    res.status(200).json({
      meals
    })

  } catch (err) {
    res.status(500).json(err)
  }
});

BTW, versi node Anda harus lebih tinggi dari 8.0 untuk menjalankan kode ini. Coba node -v di terminal.

0
Bad Dobby 29 Maret 2020, 23:13