如何使用SQLite3和node.js从异步函数返回值?

问题描述

我正在尝试使用sqlite3为不和谐的bot(在node.js上)创建一个小型数据库,并且我想创建一个函数,以提供的值更新数据库(此部分有效)或返回一个数据库

我的问题在这里,返回值始终是不确定的...

我已经了解到sqlite3命令是异步的,因此所有功能都变为异步,但是如何确保返回的值不再是未定义的?

这是我的代码

const sqlite3 = require('sqlite3');
const dbname = 'dbStocks';

module.exports = function gestionBDD(update,nomArticle,quantitéArticle) {
 console.log('1 ' + quantitéArticle);

 let db = new sqlite3.Database(dbname,(err) => {
  if (err) throw err;
  console.log('Démarrage de ' + dbname);
 });

 db.serialize(() => {
  nomArticle = '"' + nomArticle + '"';

  if (update) {
   //Si update est true : maj des quantités via le tableau articles

   db.run(
    `UPDATE stocks
                SET Quantité = (` +
     quantitéArticle +
     `)
                WHERE Article = (` +
     nomArticle +
     `)`
   );
  } else if (!update) {
   db.each(
    `SELECT Quantité FROM stocks WHERE Article  = (` + nomArticle + `)`,(err,data) => {
     console.log('2 ' + data.Quantité);
     return data.Quantité;
    }
   );
  }

  console.log('4 ' + quantitéArticle);
  db.close((err) => {
   if (err) throw err;
   console.log('Arrêt de ' + dbname);
  });
 });
};

我得到这个结果:

1 undefined
4 undefined
3 undefined
Démarrage de dbStocks
2 500
Arrêt de dbStocks

3 undefined是我的console.log()调用函数index.js的{​​{1}}中的gestionBDD

解决方法

您可以返回一个承诺,稍后可以将其解析为函数返回:

return new Promise((resolve,reject) => {
 db.run(`query statement here`,(err,row) => {
  if (err) reject(err);
  resolve(row);
 });
});

将此功能写在函数顶部以使其具有异步功能。调用函数时,请使用以太awaitthen来获取返回结果数据。