Nodejs mysql query 的结果变量无法传递 求解

Nodejs mysql query 的结果变量无法传递 求解

    var cache = {};
var userId = datum.uniqueID;
mysql.query('select accountID, deviceID, uniqueID from Device  WHERE uniqueID = ’ + mysql.escape(userId),
function(err, result, fields) {
if (err) throw err;
else {
for (var i in result) {
var res = result[i];
cache.accountID = res.accountID;
cache.deviceID = res.deviceID;
console.log(result);                          //可以打印结果
console.log(cache.accountID);     //可以打印结果

            }
        }
    });

console.log(result);                            //无法打印结果
console.log(cache.accountID);           //无法打印结果

sipgear


4 回复

好的,根据你提供的标题和内容,我将详细解释为什么在你的代码中 resultcache.accountID 无法在预期的位置被打印出来,并提供一个改进的示例代码。

问题分析

在你的代码中,mysql.query 是一个异步操作。这意味着当你调用 mysql.query 时,代码并不会立即等待查询完成。相反,它会继续执行后续的代码(如 console.log(result)console.log(cache.accountID)),而这些代码会在数据库查询完成之前运行。

因此,在 mysql.query 回调函数内部,你可以访问到查询的结果,但在外部,由于查询还未完成,所以无法获取到结果。

解决方案

为了确保在查询完成后执行某些操作,你需要将依赖于查询结果的代码放在回调函数内部。以下是修改后的代码示例:

var cache = {};

// 假设 datum 和 mysql 已经定义
var userId = datum.uniqueID;

mysql.query('SELECT accountID, deviceID, uniqueID FROM Device WHERE uniqueID = ' + mysql.escape(userId), 
    function(err, result, fields) {
        if (err) throw err;
        
        if (result.length > 0) {
            var res = result[0]; // 假设查询结果只有一行数据
            cache.accountID = res.accountID;
            cache.deviceID = res.deviceID;
            
            // 在这里执行需要使用查询结果的操作
            console.log(result);
            console.log(cache.accountID);
            
            // 如果需要将结果传递给其他函数或模块,可以在这里进行
            processResult(cache);
        } else {
            console.log("No results found");
        }
    });

function processResult(cache) {
    // 在这里处理查询结果
    console.log("Final Result:", cache);
}

// 注意:不要在此处尝试打印 result 或 cache.accountID,因为它们尚未准备好

关键点解释

  1. 异步操作mysql.query 是一个异步函数,它不会阻塞后续代码的执行。
  2. 回调函数:在 mysql.query 的回调函数内部,我们可以安全地访问到查询结果。
  3. 避免外部访问:不要在 mysql.query 外部尝试访问 resultcache.accountID,因为这些变量只有在查询完成后才会被赋值。

通过这种方式,你可以确保在查询完成后再处理结果,从而避免了你遇到的问题。


  • 后两行代码无法打印是正常的,因为回调函数的执行不一定就在这两句的前面
  • 了解下node.js的异步机制吧

恩,问题已经解决,谢谢。

在Node.js中使用MySQL查询时,需要注意的是,mysql.query 是一个异步操作。这意味着它会在未来的某个时刻完成,并且它的回调函数(即你在mysql.query中传入的函数)会在查询完成后执行。因此,当你在查询之后立即尝试访问resultcache变量时,这些变量可能还没有被赋值。

下面是修改后的代码,展示了如何正确处理这种情况:

var cache = {};

var userId = datum.uniqueID;

mysql.query('SELECT accountID, deviceID, uniqueID FROM Device WHERE uniqueID = ' + mysql.escape(userId), 
    function(err, results, fields) {
        if (err) throw err;

        if (results.length > 0) {
            var res = results[0]; // 假设你只关心第一个匹配的结果
            cache.accountID = res.accountID;
            cache.deviceID = res.deviceID;

            console.log(results); // 打印结果
            console.log(cache.accountID); // 打印accountID
        } else {
            console.log("未找到匹配项");
        }
    }
);

// 注意:这里的console.log语句会在mysql.query的回调之前执行。
console.log(result); // 这里result是undefined
console.log(cache.accountID); // cache.accountID也是undefined

关键点在于,你需要将所有依赖于查询结果的逻辑放在查询的回调函数内部。这是因为直到查询完成并调用回调函数后,result才会被定义。如果你需要在其他地方使用查询结果,考虑定义一个函数来处理结果并在查询的回调中调用该函数。

回到顶部