【问题标题】:passing data to function and using it node.js sql将数据传递给函数并使用它 node.js sql
【发布时间】:2022-01-26 06:05:20
【问题描述】:

我有这个:

function afterCreateThePayment(req, res, rows) {

  for (var i = 0; i < rows.length; i++) {
    
    console.log(rows.length)
    var selecter = "SELECT * from SCHEDULE WHERE CLIENT_USERNAME = ? AND SESSION_STATUS = ?"
    //pass rows into this function
    mysqlconn.connect(function(err) {
          if (err) {
            console.error('Database connection failed: ' + err.stack);
            return;
          }
    
        mysqlconn.query(selecter, [rows[i]["USERNAME"], 'CONFIRMED'], async function(err, scheduleData) {
            if (err) {
                console.log(err);
            }
            

            for (var x = 0; x < scheduleData.length; x++) {
                console.log(scheduleData[x])
            }
            
            // mysqlconn.end();
        })
       
    })
   
}
} 

如您所见,我将rows 传递给此函数,然后尝试使用rows[i]["USERNAME"] 作为查询参数之一。但是,当我这样做时,我得到了错误

TypeError: Cannot read property 'USERNAME' of undefined

所以我不确定在这里做什么,或者我的逻辑是否正确。有人可以帮忙吗?

【问题讨论】:

  • 你能在函数的第二行做一个console.log(rows)吗?你在那里做什么?
  • @JohnniO。它返回我需要的所有内容,表中的所有数据
  • 当您在循环开始之后编写 console.log(rows[i]) 时会得到什么?是否有一个名为 USERNAME 的属性?也许这个属性在 rows[i] 内的数组中?
  • @JohnniO。它再次返回我想要的所有值。 username 确实存在,它是从我的数据库表中返回的数据。我认为问题在于,当我在此处定义的技术新功能mysqlconn.connect(function(err) { 中使用rows[i]["USERNAME"] 时。但如果我通过行,它仍然给我同样的错误。所以这就是让我感到困惑的地方!

标签: javascript mysql sql node.js


【解决方案1】:

您的问题是他的循环变量i 的范围为afterCreateThePayment。请记住,javascript 中的 var 使用函数范围,这与您可能熟悉的 C 风格语言中的块范围不同。

我假设来自mysqlconn.connect 的回调是异步的。这意味着循环继续执行,递增i。到回调发生时,循环已超出范围。如果您在回调中查看i(而不是rows)的值,您会看到发生了什么。

这是一个类似的例子:

for (var i = 0; i < 5; i++)
{
  function internal()
  {
    console.log(i);
  }
  setTimeout(() => {internal();},1000);
}

最简单的选择是将循环中的var i 替换为let i。进行此更改将使i 块作用域,因此该值将仅适用于您当前对mysqlconn.connect 的调用。在我的示例中,这很简单:

for (let i = 0; i < 5; i++)
{
  function internal()
  {
    console.log(i);
  }
  setTimeout(() => {internal();},1000);
}

【讨论】:

  • 感谢您的回答!所以你基本上是说用let i 替换var i,但也把setTimeout(() =&gt; {internal();},5);(但为我的代码编辑)也放在那里?
  • 拒绝setTimeout 部分——这只是为了使我的示例在没有外部调用的情况下异步。您需要做的就是将var i 换成let i
  • 哦,我明白你在说什么。这就像一个魅力。太感谢了!你的解释很有帮助
猜你喜欢
  • 2013-12-09
  • 1970-01-01
  • 2016-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-30
  • 2014-03-01
  • 1970-01-01
相关资源
最近更新 更多