【问题标题】:Node.js and SQL: How can I get the value outside of the for loop?Node.js 和 SQL:如何在 for 循环之外获取值?
【发布时间】:2021-12-15 02:31:48
【问题描述】:

使用 Node.js 和 MySQL 数据库我正在做一个小项目。

我正在尝试遍历一个数组以从 MySQL 数据库中获取一些值。我正在搜索用户输入的“药物名称”对应的“药物 ID”。我的代码工作正常,这就是它的外观。

var medizinArray = [];

function appendArray(input) {
  medizinArray.push(input);
}

var sqlMedNameToId = "SELECT MedikamentId FROM Medikament WHERE Bezeichnung = ?"

for (var i=0;i<medicineMontag.length;i++){
  var montagsMedizin = medicineMontag[i];
  mySqlConnection.query(sqlMedNameToId, montagsMedizin, function(err, rows, fields){
    if(!err) {
      result = rows[0].MedikamentId;
      appendArray(result);
    } else {
      console.log(err);
      }
  })
}

console.log(medizinArray);

代码正在运行,但我无法将 medizinArray 退出 for 循环。在我的控制台中,我得到一个空数组。当我将 console.log(medizinArray) 放入 for 循环中时,我得到了我想要的数组。

我目前不熟悉 Promises。我阅读了它并看到了其他一些问题,但我不知道如何在我的代码中实现 Promises。

【问题讨论】:

  • '我目前不熟悉 Promises'。异步编程(async/await,Promise)是 javascript 编程的重要组成部分。您应该至少先学习基础知识。否则无论如何回答你的问题都没有意义
  • @ABDULLOKHMUKHAMMADJONOV 感谢您的建议。我想我对此无话可说。 :)

标签: javascript mysql sql node.js promise


【解决方案1】:

SQL 操作是异步的,因此要在回调之外获取结果,您需要将它们包装在 Promise 中,并在操作成功时调用 resolve() 函数。使用以下任何技术:

异步/等待技术:

(async function(){
  let medizinArray = [];

function appendArray(input) {
  medizinArray.push(input);
}

let sqlMedNameToId = "SELECT MedikamentId FROM Medikament WHERE Bezeichnung = ?"
await new Promise(function(resolve, reject){
let e;
for (let i=0;i<medicineMontag.length;i++){
  let montagsMedizin = medicineMontag[i];
  mySqlConnection.query(sqlMedNameToId, montagsMedizin, function(err, rows, fields){
    if(e) return; 
    if(!err) {
      result = rows[0].MedikamentId;
      appendArray(result);
    } else {
      //console.log(err);
      e = true; 
      return reject(err);
      }
    if(i == medicineMontag.length-1) resolve(result);
  })
}
}
);

console.log(medizinArray);//now medizinArray shows up here
})().catch(function(err){console.log(err)});

承诺/然后技巧:

let medizinArray = [];

function appendArray(input) {
  medizinArray.push(input);
}

let sqlMedNameToId = "SELECT MedikamentId FROM Medikament WHERE Bezeichnung = ?"

new Promise(function(resolve, reject){
let e; 
for (let i=0;i<medicineMontag.length;i++){
  let  montagsMedizin = medicineMontag[i];
  mySqlConnection.query(sqlMedNameToId, montagsMedizin, function(err, rows, fields){
    if(e) return;
    if(!err) {
      result = rows[0].MedikamentId;
      appendArray(result);
    } else {
      console.log(err);
      e = true; 
      return reject(err); 
      }
    if(i == medicineMontag.length-1) resolve(result);
  })
}
}
).then(function(result){
console.log(medizinArray);//now medizinArray shows up here
}).catch(function(err){
  console.log(err);
});

【讨论】:

  • 感谢您的回答!我尝试了你的两个解决方案,但我无法让它在我的程序中运行。在我的控制台中,我没有收到错误,所以我看不出问题出在哪里。我仍在尝试理解 javascript 的同步/异步概念的概念。如果我能把我的代码带到工作中,我会发布我的答案。
  • @durikr 我已经更新了我的答案。问题是在您的代码中过度使用 var 关键字。需要注意的是,不要在 for 循环中使用 var 关键字。我已将所有 var 关键字更改为 let 关键字。
猜你喜欢
  • 1970-01-01
  • 2013-05-30
  • 2015-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-26
  • 2016-11-30
相关资源
最近更新 更多