NodeJS Promise mengembalikan nilai yang tidak ditentukan dalam keadaan rawak
P粉321584263
P粉321584263 2024-01-16 14:46:41
0
1
378

Pertama sekali, saya minta maaf jika soalan ini sudah mempunyai jawapan, tetapi saya telah mencari soalan seperti ini dan tidak menemui apa-apa yang berguna.

Saya sedang membangunkan aplikasi NodeJS yang menggunakan pakej mysql npm untuk menanyakan pangkalan data. Saya telah menulis beberapa pertanyaan yang berfungsi dengan baik dengan bantuan janji (kerana itulah cara modul SQL berfungsi). Saya tidak mempunyai masalah apabila fungsi prosedur pertanyaan get_works (ditakrifkan di bawah) dipanggil secara normal. Walau bagaimanapun, apabila saya memanggil fungsi prosedur ini dalam Penghala Ekspres, saya mendapat tingkah laku pelik.

view.get("/works", (req, res) => {
    (async () => {
        res.json(await get_works());
    })()
});

async function get_works(offset=0,limit=6){

    let cdc_database = mysql.createConnection({
        /*Filled with credentials*/
    });
    
    const get_texts = `SELECT TEXID,TXNOM,TXRES FROM TEXTE LIMIT ${limit} OFFSET ${offset};`; // Valid request

    /*Two steps: get texts and get authors of each texts*/

    cdc_database.connect();
    const texts = await database_promise_query(cdc_database, get_texts);
    /*This await always have a correct output*/

    let text_authors = [];

    for(i = 0; i < texts.length; i++){

        get_text_authors = `SELECT AUPRE, AUNOM FROM AUTEURS,ECRIT_PAR\
        WHERE AUTEURS.AUTID=ECRIT_PAR.AUTID AND TEXID=${texts[i].TEXID};`; // Request is valid

        text_authors[i] = (await database_promise_query(cdc_database, get_text_authors));
        /*          ^^^^^^^^
        The await above returns an undefined value randomly when called through the router
        */
        if(text_authors[i] === undefined){
            console.error(`[get_works] - Server error on ${i}th text's authors`)
            text_authors[i] = [{AUPRE: "Prénom", AUNOM: "Nom"}]
        }

    }
    

    cdc_database.end();

    return works_to_JSON(texts, text_authors)
}

Kadangkala pertanyaan kepada pangkalan data tidak akan mempunyai nilai yang tidak ditentukan, tetapi apabila terdapat satu nilai yang tidak ditentukan, semua nilai berikutnya juga akan tidak ditentukan.

Example trace log

(1st call, 3 errors)
[
  [ RowDataPacket { AUPRE: 'xxx', AUNOM: 'xxx' } ],
  [ RowDataPacket { AUPRE: 'xxx', AUNOM: "xxx" } ],
  [ RowDataPacket { AUPRE: 'xxx', AUNOM: 'xxx' } ],
  [ { AUPRE: 'Prénom', AUNOM: 'Nom' } ],
  [ { AUPRE: 'Prénom', AUNOM: 'Nom' } ],
  [ { AUPRE: 'Prénom', AUNOM: 'Nom' } ]
]

(2nd call, no error)
[
  [ RowDataPacket { AUPRE: 'xxx', AUNOM: 'xxx' } ],
  [ RowDataPacket { AUPRE: 'xxx', AUNOM: "xxx" } ],
  [ RowDataPacket { AUPRE: 'xxx', AUNOM: 'xxx' } ],
  [ RowDataPacket { AUPRE: 'xxx', AUNOM: 'xxx' } ],
  [ RowDataPacket { AUPRE: 'xxx', AUNOM: "xxx" } ],
  [ RowDataPacket { AUPRE: 'xxx', AUNOM: 'xxx' } ],
]

Ini pembalut janji saya:

function database_promise_query(database, query){
    return new Promise(res => {
        database.query(query, (error, results, fields) => {
            if(error) {res(undefined); console.log(error)}
            res(results);
        })
    })
}

Walau bagaimanapun, memanggil fungsi ini di luar penghala seperti ini berfungsi dengan sempurna:

(async () => {
    await get_works(0, 10);
    await get_works(10, 10);
    await get_works(20, 10);
    await get_works(30, 10);
})()

Adakah saya terlepas sesuatu? Saya rasa semua pertanyaan adalah betul kerana saya boleh mendapatkan hasil yang diingini, masalahnya mungkin dengan pemprosesan async/menunggu saya. Terima kasih atas semua bantuan yang anda boleh berikan.

Sunting 1

Berdasarkan cadangan @tromgy, saya menulis semula pembungkus janji.

function database_promise_query(database, query){
    return new Promise((res, rej) => {
        database.query(query, (error, results, fields) => {
            if(error) {rej(error); throw new Error(error)}
            console.log("Received response", results)
            res(results);
        })
    })
}

Walau bagaimanapun, penolakan tidak pernah berlaku (yang munasabah kerana tiada data yang sepadan dalam pangkalan data). Untuk membersihkan log, saya melumpuhkan penghala lain untuk permintaan serupa menggunakan sambungan pangkalan data yang berbeza. Mengalih keluar penghala ini juga menyelesaikan pepijat. Saya tidak tahu bagaimana ini mungkin (mungkin pembolehubah diisytiharkan global, jadi saya akan mencari masalah seperti itu).

P粉321584263
P粉321584263

membalas semua(1)
P粉063862561

Seperti yang ditunjukkan dalam gambar, masalahnya ialah pembilang gelung kongsi. Salah seorang rakan sekerja saya terlupa untuk menambah kata kunci let sebelum lelaran, jadi gelung for melonjak nilai.

Saya benci ciri JavaScript ini sekarang. Terima kasih atas bantuan!

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!