Node JS 异步数据库调用
Node JS Asynchronous Database Calls
尽管数据库函数没有返回值,但我无法让节点进行数据库调用而不继续进行。
这是基本的 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;
}
}
但是在测试中,这证明我做错了。我知道我可能想使用我已经厌倦的节点异步模块。我也尝试过使用瀑布方法,以及并行和许多其他在线教程。我觉得 request.on 函数应该是并行的,然后数据库调用异步,所以当节点等待数据库服务器的响应时,它可以自由地继续任何其他请求,将排队时间留给最低限度。
如果我对 node js 的任何概念有误解,请告诉我。
您正在 returning result
并在查询从数据库中 returned 其值之前关闭连接。将该代码放入回调中。
正在修复您的代码,它应该如下所示:
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));
,然后再等待查询的响应。
为了解决这个问题,您需要 return 某种回调。
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);
});
});
尽管数据库函数没有返回值,但我无法让节点进行数据库调用而不继续进行。
这是基本的 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;
}
}
但是在测试中,这证明我做错了。我知道我可能想使用我已经厌倦的节点异步模块。我也尝试过使用瀑布方法,以及并行和许多其他在线教程。我觉得 request.on 函数应该是并行的,然后数据库调用异步,所以当节点等待数据库服务器的响应时,它可以自由地继续任何其他请求,将排队时间留给最低限度。
如果我对 node js 的任何概念有误解,请告诉我。
您正在 returning result
并在查询从数据库中 returned 其值之前关闭连接。将该代码放入回调中。
正在修复您的代码,它应该如下所示:
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));
,然后再等待查询的响应。
为了解决这个问题,您需要 return 某种回调。
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);
});
});