Node.js - SQL函数不返回值

时间:2016-04-16 13:58:05

标签: mysql sql node.js socket.io

我想从MySQL数据库获取数据,我使用带有SQL的Node.js,这是我的服务器代码:

var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);
var mysql = require('mysql');

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

function getData(res){
    var tempVal = 1377;
    connection.connect();
    connection.query('SELECT * FROM tempvalues ORDER BY datetime DESC LIMIT 1', function(err, rows){
        console.log(rows);
        tempVal = rows;
    });
    connection.end();
    return tempVal;
}

app.get('/', function(req, res){
  res.sendfile('index.html');
});

io.on('connection', function(socket){
    socket.on('clientSent', function(data){
        if(data == "GET")
            socket.emit("serverSent", getData());
    })
})

http.listen(3000, function(){
  console.log('listening on *:3000');
});

如果我转到localhost:3000我只获得1377作为值而不是数据库中的实际值,即使控制台打印了正确的值。那是为什么?

1 个答案:

答案 0 :(得分:2)

你的代码中有一些不好的东西。 第一。认为对数据库的查询在大多数情况下都是异步的。

您的代码已解释:

function getData(callback){
    var tempVal = 1377;
    connection.connect();
    connection.query('SELECT * FROM tempvalues ORDER BY datetime DESC LIMIT 1', function(err, rows){
        console.log(rows);
        return callback(err, rows);
    });
    connection.end();
}

与异步代码作斗争的一种简单方法是回调。让你的getData函数看起来像:

io.on('connection', function(socket){
    socket.on('clientSent', function(data){
        if(data == "GET")
            getData(function(error, result){
              if(!error) socket.emit("serverSent", result);
            });
    })
});

然后使用如下函数:

<label asp-for="Files.PromoImage" class="col-md-2 control-label"></label>
<div class="col-md-10">
    <input asp-for="Files.PromoImage" class="form-control" />
    @if (Model.Content.NewArticle)
    {
        <span asp-validation-for="Files.PromoImage" class="text-danger"></span>
    }
</div>
<div class="col-md-8">
    <div asp-validation-summary="ValidationSummary.All" class="text-danger"></div>
</div>