Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 具有错误工作流的Nodejs回调_Javascript_Mysql_Node.js - Fatal编程技术网

Javascript 具有错误工作流的Nodejs回调

Javascript 具有错误工作流的Nodejs回调,javascript,mysql,node.js,Javascript,Mysql,Node.js,我是NODE的新手,正在尝试以下代码: require('../../constants.js'); function dbConnect() { var mysql = require('mysql'); var connection = mysql.createConnection({ host : DB_HOST, database : DB_NAME, user : DB_U

我是NODE的新手,正在尝试以下代码:

require('../../constants.js');

function dbConnect() {
    var mysql       = require('mysql');
    var connection  = mysql.createConnection({
        host        : DB_HOST,
        database    : DB_NAME,
        user        : DB_USER,
        password    : DB_PASS,
    });
    connection.connect(function(err) {
        console.log("Database is connected ...");

    });
    return connection;

}

function dbDisconnect(connection) {
    connection.end();
    console.log("Closing DB Connection");
}

function findPlayer(surname) {
    var connection = dbConnect(); 
    console.log("Finding -> " + surname);
    var query = 'SELECT * FROM players WHERE surname = "' + surname + '"';
    connection.query(query, function(err, rows, fields) 
    {
        if (err) throw err;

        for (var i in rows) {
            console.log('Players: ', rows[i].surname);
        }   
    });

    dbDisconnect(connection);   

}

exports.findPlayer = findPlayer;
之后,我有一个laucher文件:

require('./constants.js');
var aar = require('./libs/DBManager.js')
console.log('Loading DBManager');    
var player = aar.findPlayer('Potter');    
console.log(player);
正确的工作流程是:

  • 加载数据库管理器
  • 数据库已连接
  • 查找->波特
  • 玩家:波特
  • 关闭数据库连接
然而,结果是:

  • 加载数据库管理器
  • 查找->波特
  • 关闭数据库连接
  • 未定义
  • 数据库已连接
  • 玩家:波特

我怎么了?是否存在回调问题?

在确定查询完成之前,您正在关闭连接。 您应该将
dbDisconnect(连接)置于断开状态在查询结束后但在回调内部

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

        for (var i in rows) {
            console.log('Players: ', rows[i].surname);
        }  
       dbDisconnect(connection); 
    });

而且findPlayer没有返回任何内容,因此
console.log(player)将是未定义的

Javascript本质上是异步的,它不等待I/O操作。任何网络调用(包括连接到数据库的请求)都属于I/O操作

问题是,您正在请求一个DB连接,在它返回之前,您正在打电话为玩家获取数据。我建议您将回调方法传递给

dbConnect(callback)
在该回调中,传递要执行的查询或操作:

  • 创建一个回调方法,该方法包含检索玩家信息的代码
  • 调用dbConnect()以建立与数据库的连接,并将回调作为参数传递
  • 建立连接后,执行回调
  • 完成后,可以关闭连接,但要确保关闭连接的代码在回调中,并且只有在从Db接收到数据后才执行

  • 相反,如果您对ORM感到满意,我建议您尝试一下,它将创建和断开与DB的连接的要求抽象出来,这样您就可以专注于crud操作。

    请同时指定文件名,解释有点混乱。但是你需要考虑的是,连接到DB是异步的,所以当你请求连接到db NoDE.js时,向前移动并执行下一个语句。因此,您将获得连接到数据库的消息。代码的第一部分是libs/DBManager.js,第二部分是index.js。您能给我一个关于它的代码示例吗?