Nodejs打印问题

时间:2015-11-06 11:46:32

标签: node.js

这是我的app.js文件

var http =  require('http');
var url = require('url');
var mysql = require('mysql');
var requestListener = function(request, response){
var urlParse = url.parse(request.url,true);
var path = urlParse.pathname;
var query = urlParse.query;
var jsonString;
if(path === "/getArticleById"){
    var conn = mysql.createConnection({
        host:'localhost',
        port:'3306',
        user:'root',
        password:'root123',
        database:'food' 
    });
    conn.connect(function(err){
        if(err){
            console.log('Error connecting to database');
            return;
        }
        response.writeHead(200, {'Content-Type': 'text/plain' });
    });
    var id = query.id;
    conn.query('select * from article where id=?', id,function(err,rows){
      if(err){
          console.log(err);
      }

      jsonString = rows;
    });
    conn.end();
    console.log(jsonString);
}
};

var server = http.createServer(requestListener);
server.listen(8080);

在conn.query里面的jsonString中,我得到了打印行的值。 最后一个console.log没有打印任何东西,它也是jsonString。

抱歉,我是node.js的新手,不知道如何使用对象。

1 个答案:

答案 0 :(得分:1)

Javascript本质上是异步的。

 conn.query('select * from article where id=?', id,function(err,rows){
      if(err){
          console.log(err);
      }

      jsonString = rows;
    });

尝试在回调中打印jsonString。所以,你的代码看起来应该是

 conn.query('select * from article where id=?', id,function(err,rows){
      if(err){
          console.log(err);
      }

      jsonString = rows;
      console.log(jsonString);
    });

您的代码如何执行

  1. 对var id的分配即将完成。
  2. 对db的查询被点击。这是一个耗时的过程(异步任务),当此查询得到解决时,将调用您的回调函数。请注意,这将花费一些时间,这意味着在某个时候将调用此回调,您将获得行。
  3. 在调用query()之后(但在获得结果/回调之前),您的下一行代码即conn.end()将被执行。然后你试图打印jsonString,注意,直到现在你还没有从DB返回结果(因为它是异步操作)。这就是为什么jsonString还没有保留任何价值的原因。因此你没有打印出结果。
  4. <强>解决方案:

    检索结果后打印jsonString。这意味着,在回调中。