【问题标题】:How to make return wait for MySQL connection to end? Node.js如何让返回等待 MySQL 连接结束?节点.js
【发布时间】:2021-07-24 20:14:50
【问题描述】:

我是 Node.js 的新手,我正在 Wix 上测试一些代码来检查我的数据库是否在允许创建新帐户名称之前已经存在(我故意不使用 WHERE 标记用于学习目的的时刻)。

当前方法检查帐户名称在连接完成之前返回,不允许正确进行检查。

任何帮助表示赞赏。

    export function tryToCreateAccount(login, password) 
{
    var mysql = require('mysql');

    var connection = mysql.createConnection({
        host: 'host',
        user: 'user',
        password: 'pass',
        database: 'db'
    });

    if(checkAccountName(login, connection))
    {
        console.log("Name didn't exist.");
    }
    else
    {
        console.log("Name Existed.");
    }
}

function checkAccountName(account_name, connection)
{
    var accountNameAvailable = true;

    connection.connect(function (err)
    {
        if(err) throw err;
        connection.query("SELECT login FROM accounts", function (err, result)
        {
            if (err) throw err;

            for(var i = 0; i < result.length ; i++)
            {
                if(result[i].login == account_name)
                {
                    console.log("Should of been false");
                    connection.end;
                    accountNameAvailable = false;
                }
            }

        });
        connection.end;
    });

    return accountNameAvailable;
}

【问题讨论】:

    标签: mysql node.js asynchronous wait


    【解决方案1】:

    我知道为什么它什么也没做,因为连接结束,下一个调用太晚了,而下一个在连接代码块内。

    const mysql = require('mysql');
    const connection = mysql.createConnection({
        host: 'host',
        user: 'user',
        password: 'pass',
        database: 'db'
    });
    
    export function tryToCreateAccount(login, password) 
    {
        checkAccountName(login, connection, function(err, accountNameAvailable)
        {
          if(err || !accountNameAvailable){
            console.log("Name didn't exist.");
          }
          else
          {
            console.log("Name Existed.");
          }
       })
    }
    
    function checkAccountName(login, connection, next)
    {
        var accountNameAvailable = false;
    
        connection.connect(function (err)
        {
            if(err) next(err);
            connection.query("SELECT login FROM accounts", function (err, result){
                if (err) next(err);
                for(var i = 0; i < result.length ; i++)
                {
                    if(result[i].login == login)
                    {
                        accountNameAvailable = true;
                    }
                }
                next(null, accountNameAvailable);
                connection.end();
            });
        });
    }
    

    【讨论】:

    • 很高兴看到你想通了。我实际上无法测试我的代码,因为我不想花时间设置数据库:)
    • 我提出了一个关于回调的新问题,因为出于某种原因向 tryToCreateAccount 添加回调会破坏它,也许您有一些见解? link
    【解决方案2】:

    欢迎来到 Node.js(以及异步函数(和 Promises(和回调)的世界))

    我以“回调”风格编写了此代码,但我强烈建议您研究 async/await 以了解此类内容,并了解“承诺”如何融入其中。

    // to test, call tryToCreateAccount('login','pass',function(err,data){console.log(err,data)});
    
    const mysql = require('mysql');
    const connection = mysql.createConnection({
        host: 'host',
        user: 'user',
        password: 'pass',
        database: 'db'
    });
    export function tryToCreateAccount(login, password, next) 
    {
        checkAccountName(login, connection, function(err, accountNameAvailable){
          if(err || !accountNameAvailable){
            console.log("Name didn't exist.");
            next(err || 'Name didn't exist.')
          }
          else
          {
            console.log("Name Existed.");
            next(null, true)
          }
       })
    }
    
    function checkAccountName(account_name, connection, next)
    {
        var accountNameAvailable = false;
    
        connection.connect(function (err)
        {
            if(err) next(err);
            connection.query("SELECT login FROM accounts", function (err, result){
                if (err) next(err);
                for(var i = 0; i < result.length ; i++)
                {
                    if(result[i].login == account_name)
                    {
                        console.log("Should of been false");
                        connection.end;
                        accountNameAvailable = true;
                    }
                }
                connection.end();
                next(null, accountNameAvailable);
            });
    
        });
    }
    

    【讨论】:

    • 感谢您的回复,我想我现在至少理解了这个回调,问题是现在什么也没发生。为简单起见,我在测试时从 tryToCreateAccount 中删除了回调,因为它目前不是必需的。当我运行时,我在控制台中什么也没有。我添加了一些 console.log 语句来查找它停止的位置。它进入try to create,然后进入checkAccountName,然后停止。如果我在 connection.connect 代码块中放置一条语句,它永远不会出现。没有错误被抛出。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-10
    • 1970-01-01
    • 2016-06-15
    • 2021-05-13
    • 2018-09-18
    • 2018-06-06
    相关资源
    最近更新 更多