javascript - Node JS 异步数据库调用

标签 javascript mysql node.js asynchronous parallel-processing

尽管数据库函数没有返回值,但我在让 Node 不继续进行数据库调用时遇到问题。

这是基本的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;
    }
}

但是在测试中,这证明我做错了。我知道我可能想使用我已经厌倦的 Node 异步模块。我也尝试过使用 waterfall 方法,以及并行和许多其他在线教程。我觉得 request.on 函数应该是并行的,然后数据库调用异步,所以当 Node 等待数据库服务器的响应时,它可以自由地继续任何其他请求,将排队时间保持在最低限度.

如果我对 node js 的任何概念有误解,请告诉我。

最佳答案

您正在返回 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);
    });
});

关于javascript - Node JS 异步数据库调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30013802/

相关文章:

javascript - 避免 iOS9 中 url 方案重定向的确认对话框

c# - 在统一上使用 c# 访问 MySQL 数据库?

php - 该查询不适用于该表,那么如何使用该表更新查询该公式?

node.js - 区分dynamodb TransactionCanceledException的方法

javascript - 在值中插入特殊字符

javascript - 带有路由的 React 中的单页应用程序 - 相同的结构,不同的内容

javascript - 为什么在 NodeJS 中返回对象而不是计数 sequelize.js

javascript - 回调无法正常工作node.js

javascript - 如何将字体大小设置为浏览器窗口的 100%

php - 查询输出中缺少 DATETIME 值,然后自动填充缺少的值并获得正确的输出