javascript - 从 Node.js 中的嵌套函数中获取变量

标签 javascript node.js

我正在使用一个函数来检查用户是否已在网站上注册。 但是我不知道如何从函数 selectEmail()

中获取 rows 的值

我试图将它存储在 temp 中,但它似乎将它存储在它自己的本地版本中,并且一旦查询部分结束,我就会留下一个空变量。

function checkEmail(email, req, res){
  var temp;
  dbConnect(req,res);
  var query = 'SELECT EMAIL FROM USERS WHERE EMAIL="'+email+'"';
  connection.query(query, function selectEmail(err,rows,fields){
    if (err) {
        throw err;
      }
    temp=rows;
  })
  dbClose(req,res);
  console.log(temp);
  if (temp==""){
      console.log('No matching email in database');
      return 0;
  }
  else{
      console.log('Duplicate Email detected in database');
      return 1;
  }
}

我听说我应该使用回调,但我也不知道如何让它工作。

最佳答案

我猜测 connection.query 是异步的,这意味着它在其余代码执行之前不会完成。这意味着当您到达 if(temp==""){ 时,temp 没有值。

为了处理这个问题,需要使用回调。回调是代码完成后调用的函数,在本例中为 connection.query()。这正是您在本例中所拥有的,只是格式不太正确:

connection.query(query, function selectEmail(err,rows,fields){
    if (err) {
        throw err;
    }
    temp=rows;
})

这里 selectEmail() 是回调,只不过回调应该以函数指针或匿名函数(没有名称)的形式提供:

connection.query(query, function(err,rows,fields){
    if (err) {
        throw err;
    }
    temp=rows;
});

此代码很可能在 checkEmail() 返回后出现。 conection.query() 完成后您希望发生的任何事情都应该回调中或由回调调用。像这样:

connection.query(query, function(err,rows,fields){
    if (err) {
        throw err;
    }

    dbClose(req,res);

    if (rows==""){
        console.log('No matching email in database');
        handleEmailCheckFailure();
    }
    else{
        console.log('Duplicate Email detected in database');
        handleEmailCheckSuccess();
    }
});

当然,您希望 checkEmail() 根据检查是否成功返回一个值。这不适用于异步调用。您将需要具有处理通过和失败情况的函数(上面的handleEmailCheckFailure等)。您还需要注意,在调用这两种情况之前,根据连接情况,会花费一些时间。

关于javascript - 从 Node.js 中的嵌套函数中获取变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15119976/

相关文章:

javascript - QT 使用 addToJavaScriptWindowObject()

javascript - socket.io 向每个客户端发出/广播

node.js - 找不到 AngularJS Express 咖啡 Assets Controller

node.js - 为什么当我运行 Angular/React 项目时它无法在我的本地主机上运行?

node.js - mongodb中的json格式错误

node.js - 如何在同一 Node 服务器上提供 React 应用程序和 Api?

javascript - 如何以编程方式滚动 Bootstrap 下拉菜单

javascript - 如何点击具体坐标?

javascript - WebRTC dataChannel 永远不会打开

node.js - 在 Node.js TCP 套接字中测试 keepalive 的功能