簡體   English   中英

等待不適用於 nodejs 中的插入命令

[英]await not working for insert command in nodejs

我有一個插件數組,我想將它們插入到 db 表中。

var addons = [sample,sample,.....]

return new Promise((resolve,reject) => {
    addons.foEach(async addon => {

        // first check if the items is in db
        const response = await Kinex.where({}).from('table_name');

        if(response.length == 0){
            // insert new record
            const insertResp = kinex('table_name').insert(addon)
            addon.system_id = insertResp[0];
        }else{
            addon.system_id = response[0].id;
        }
    })
})

我期望的是在數據庫中有唯一的記錄,但上面的代碼在數據庫中產生了重復的記錄。 請幫忙找出代碼的問題。

問題是在循環內運行async函數。 正如@Felix 所提到的, forEach不知道異步函數,也不等待您的 where 查詢返回。 如果你想在循環內以異步方式做事,你可以用for..of循環來做。 還要確保在使用async/await時始終使用try/catch塊。 以下是您的案例中的代碼:

const addons = [sample,sample,.....];
return new Promise(async (resolve, reject) => {
    try {
        for (let addon of addons) {
            // first check if the items is in db
            const response = await Kinex.where({}).from('table_name');
            if (response.length) {
                const insertResp = await kinex('table_name').insert(addon)
                addon.system_id = insertResp[0];
            } else addon.system_id = response[0].id;
            resolve(); // resolve with whatever you wants to return 
        }
    } catch (e) {
        reject(e)
    }
});

您可以在for..of閱讀有關async/await for..of更多信息

正如@Sándor 所指出的,這是使用Promise.all的代碼:

var addons = [sample, sample, .....]
return Promise.all(addons.map(async addon => {
    // Do your async stuff here

    // first check if the items is in db
    const response = await Kinex.where({}).from('table_name');

    if (response.length == 0) {
        // insert new record
        const insertResp = kinex('table_name').insert(addon)
        addon.system_id = insertResp[0];
    } else {
        addon.system_id = response[0].id;
    }
}))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM