You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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是同步执行的,此时异步查询还未完成,自然拿不到结果。

修改方案:

  1. 给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;
  1. 修改主文件中的服务器逻辑,等待回调结果再响应:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 20:55:21