如何在节点js mysql查询函数中找到匿名函数外的返回变量值

时间:2013-08-13 12:11:13

标签: javascript mysql node.js anonymous-function

你好朋友我是节点js的新手,我们怎样才能获得mysql查询匿名函数中使用的变量值?

var alldata = function(){

var http = require('http'), mysql = require('mysql');

var client = mysql.createConnection({
       host: '127.0.0.1',
   user: 'root',
   password: ''
});

client.connect();
client.query("use cakephp2");

client.query("SELECT id, title,body,created from posts", 
        function(err, results, fields) {
            if (err) throw err;

            var output = '<h1>Latest Posts</h1><ul><table border=1><tr>';
            for (var index in fields) {
                output += '<td>' + fields[index].name + '</td>';
            }
            output += '</tr>';
            for (var index in results) {
                output += '<tr><td>' + results[index].id + '</td>';
                output += '<td>' + results[index].title + '</td>';
                output += '<td>' + results[index].body + '</td>';
                output += '<td>' + results[index].created + '</td></tr>';
            }
            output += '</ul>';
            // console.log(output);
            // return output;

        }
    ); 
  return  output ;
}
exports.alldatas = alldata();

在上面的代码中我没有在client.query中找到返回输出结果,当使用console.log(输出)给出正确的结果,但是无法访问匿名函数之外的输出值。

请帮帮我

提前致谢。

2 个答案:

答案 0 :(得分:2)

您将无法在回调函数之外访问该变量。原因是,Node.js具有一个特殊功能,即将回调函数作为执行异步IO任务后执行的下一个代码块(在您的情况下是一个mysql查询)。

当您的程序进入IO模式时,您在回调函数之后编写的代码会立即执行。并且output变量尚未就绪,直到触发回调。因此你无法访问它。

您可以阅读here

你必须使用该回调函数中的output或在那里调用其他函数并将output作为参数传递给它。

答案 1 :(得分:0)

尝试此操作并将变量范围定义为全局变量

 DBDATA="";
var alldata = function(){

var http = require('http'), mysql = require('mysql');

var client = mysql.createConnection({
       host: '127.0.0.1',
   user: 'root',
   password: ''
});

client.connect();
client.query("use cakephp2");

client.query("SELECT id, title,body,created from posts", 
        function(err, results, fields) {
            if (err) throw err;

            var output = '<h1>Latest Posts</h1><ul><table border=1><tr>';
            for (var index in fields) {
                output += '<td>' + fields[index].name + '</td>';
            }
            output += '</tr>';
            for (var index in results) {
                output += '<tr><td>' + results[index].id + '</td>';
                output += '<td>' + results[index].title + '</td>';
                output += '<td>' + results[index].body + '</td>';
                output += '<td>' + results[index].created + '</td></tr>';
            }
            output += '</ul>';
            DBDATA=output;
            // console.log(output);
            // return output;

        }
    ); 
  return  output ;
}
console.log(DBDATA);
exports.alldatas = alldata();