Node.js新手遇MySQL查询问题:浏览器返回undefined但查询成功
Node.js MySQL查询返回undefined问题解决
问题情况
我是Node.js新手,在使用MySQL查询时遇到问题。复制相关代码后,浏览器返回结果是undefined,而非数据库中的行数据,但控制台打印了got rows,说明查询本身是成功的。
主文件代码
var http = require('http'); var mysql = require('mysql'); var sql = require('./sqltest'); var pool = mysql.createPool({ connectionLimit : 100, host: "my.host", port: '3306', user: "me", database: 'db_name', password: "pw" }); http.createServer(function (req, res) { res.writeHead(200, {'Content-Type': 'text/html'}); res.write("Library is: " + sql.getLibrary(pool) ); res.end("....done. "); }).listen(8080);
sqltest.js代码
var pool; function executeQuery(query, callback) { pool.getConnection(function (err, connection) { if (err) { return callback(err, null); } else if (connection) { connection.query(query, function (err, rows, fields) { connection.release(); if (err) { return callback(err, null); } return callback(null, rows); }) } else { return callback(true, "No Connection"); } }); } function getResult(query,callback) { executeQuery(query, function (err, rows) { if (!err) { callback(null,rows); } else { callback(true,err); } }); } function getLibrary(sqlpool) { pool = sqlpool; getResult('select * from Library', function (err, rows) { if (err) { console.log(err); return 'db error'; } else { console.log("got rows"); return JSON.stringify(rows); } }); }; exports.getLibrary = getLibrary;
问题原因及解决方法
问题核心是异步回调的返回值无法被同步获取:
getLibrary函数内的数据库查询是异步操作,内部回调里返回的JSON.stringify(rows)或'db error',并不会成为getLibrary的返回值,所以sql.getLibrary(pool)调用后得到的是undefined。- 浏览器端的
res.write是同步执行的,此时异步查询还未完成,自然拿不到结果。
修改方案:
- 给
getLibrary添加回调参数,让它在查询完成后通过回调传递结果:
修改sqltest.js中的getLibrary:
function getLibrary(sqlpool, callback) { pool = sqlpool; getResult('select * from Library', function (err, rows) { if (err) { console.log(err); callback('db error'); } else { console.log("got rows"); callback(null, JSON.stringify(rows)); } }); }; exports.getLibrary = getLibrary;
- 修改主文件中的服务器逻辑,等待回调结果再响应:
http.createServer(function (req, res) { res.writeHead(200, {'Content-Type': 'text/html'}); sql.getLibrary(pool, function(err, result) { if (err) { res.write("Library is: " + err); } else { res.write("Library is: " + result); } res.end("....done. "); }); }).listen(8080);
这样就能在异步查询完成后,正确把数据库结果返回给浏览器了。
内容的提问来源于stack exchange,提问作者quilkin
相关产品推荐
相关产品推荐

