Javascript 节点JS异步数据库调用

Javascript 节点JS异步数据库调用,javascript,mysql,node.js,asynchronous,parallel-processing,Javascript,Mysql,Node.js,Asynchronous,Parallel Processing,尽管数据库函数未返回值,但在让节点不继续进行数据库调用时遇到问题 以下是基本http服务器代码: var http = require('http'); http.createServer(function (request, response) { response.writeHead(200, { 'Content-Type': 'text/plain', 'Access-Control-Allow-origin': '*' // implementation of CO

尽管数据库函数未返回值,但在让节点不继续进行数据库调用时遇到问题

以下是基本http服务器代码:

var http = require('http');

http.createServer(function (request, response) {

response.writeHead(200, {
    'Content-Type': 'text/plain',
    'Access-Control-Allow-origin': '*' // implementation of CORS
});

response.end("ok");
;
}).listen(8080,'0.0.0.0');
使用request.on('data')函数,我能够从请求中解码JSON,并继续进行数据库调用:

request.on('data', function (chunk) {
    var json = JSON.parse(chunk);
    var id = parseInt(json["id"]);
    response.end(callDatabase(id));
});
数据库功能如下所示:

function callDatabase(id) {
    var result;
    var connection = mysql.createConnection(
        {
            host        :   '192.168.1.14',
            user        :   'root',
            password    :   '',
            database    :   'test'
        }
    );

    connection.connect();
    var queryString = 'SELECT name FROM test WHERE id = 1';

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

        for (var i in rows) {
            result = rows[i].name;
        }
    });
    connection.end();
    return result;
    }
}
function callDatabase(id) {
    var result;
    var connection = mysql.createConnection(
        {
            host        :   '192.168.1.14',
            user        :   'root',
            password    :   '',
            database    :   'test'
        }
    );

    connection.connect();
    var queryString = 'SELECT name FROM test WHERE id = 1';

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

        for (var i in rows) {
            result = rows[i].name;
        }

        connection.end();
        return result;
    });
}
然而在测试中,这证明了我做错了。我知道我可能想使用节点异步模块,我已经厌倦了。我还尝试过使用瀑布方法,以及并行和许多其他在线教程。我觉得request.on函数应该是并行的,然后数据库调用异步的,所以当节点等待数据库服务器的响应时,它可以自由地处理任何其他请求,将排队时间减到最小


如果我没有理解node js的任何概念,请通知我

您将返回
结果
,并在查询从数据库返回其值之前关闭连接。将该代码放在回调中

function callDatabase(id, callback) {
    // the method code here...
    connection.query(queryString, function(err, rows, fields) {
        // code...

        // instead of returning the result, invoke the callback!
        callback(rows);
    });
}
修复代码时,应如下所示:

function callDatabase(id) {
    var result;
    var connection = mysql.createConnection(
        {
            host        :   '192.168.1.14',
            user        :   'root',
            password    :   '',
            database    :   'test'
        }
    );

    connection.connect();
    var queryString = 'SELECT name FROM test WHERE id = 1';

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

        for (var i in rows) {
            result = rows[i].name;
        }
    });
    connection.end();
    return result;
    }
}
function callDatabase(id) {
    var result;
    var connection = mysql.createConnection(
        {
            host        :   '192.168.1.14',
            user        :   'root',
            password    :   '',
            database    :   'test'
        }
    );

    connection.connect();
    var queryString = 'SELECT name FROM test WHERE id = 1';

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

        for (var i in rows) {
            result = rows[i].name;
        }

        connection.end();
        return result;
    });
}
尽管如此,这只能解决部分问题,因为现在您仍在调用
response.end(callDatabase(id))

为了解决这个问题,您需要返回某种回调

function callDatabase(id, callback) {
    // the method code here...
    connection.query(queryString, function(err, rows, fields) {
        // code...

        // instead of returning the result, invoke the callback!
        callback(rows);
    });
}
现在你可以这样称呼它:

request.on('data', function (chunk) {
    var json = JSON.parse(chunk);
    var id = parseInt(json["id"]);
    callDatabase(id, function(res) {
        response.end(res);
    });
});

你不能从异步函数返回,你必须使用回调,然后在回调中放置
响应。end
等。是否有在线的地方可以看到使用回调并向其返回值的示例?非常感谢!为了表现,我只是出于好奇。。服务器是否应保持与数据库服务器的连接?每次http请求后关闭连接是否会浪费性能?