0

Goodmorning,

I have a question/problem with script that im building,im using a include for modeling my arrays en return them to the server.js

the data show to the console but not to visitors, on a simple webpage, if i place the query and my modeling inside the server.js file it works, has somebody a reason for why the include wont return the results with the query?

Server.js

 var io = require('socket.io').listen(3000);
 var data_model = require("./data_model.js");
 io.sockets.on('connect', function(socket) {
 console.log('There is a connection');
 io.emit("data", "There is a connection");
 console.log(data_model.retrieve()); // THIS LINE WORKS, 
socket.emit("dataretrieve", JSON.stringify(data_model.retrieve()));
});

my data model

var mysql = require('mysql');
    var connection = mysql.createConnection({
    host: "",
    user: "",
    password: "",
    database: ""
   });


var data_model = {

    retrieve: function() {

    connection.query('SELECT * FROM data_retrieve', function(err, rows, fields, data) {

            if (rows.length === 0) {

            } else {

                dataretrieve = {};

                dataretrieve["data_retrieve"] = {};

                dataretrieve["data_retrieve"] = {
                    id: rows[0].id,
                    msg: rows[0].msg
                };

                return JSON.stringify(dataretrieve);

            }

        });
    }
};

module.exports = data_model;

current webpage:

 <script   src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js">      </script>
<script src="http://172.0.2.13:3000/socket.io/socket.io.js"></script>
<script>
    $(document).ready(function(){
    var socket = io.connect('http://172.0.2.13:3000');
    socket.on('data', function(data){

    document.getElementById('connection').innerHTML = data;

    });
    socket.on('dataretrieve', function(dataretrieve){
    console.log(dataretrieve); //WONT SHOW THE DATA
    });

    });
</script>
<body>
    <pre>
<div id="connection"></div>
  <div id="dataretrieve"></div>
David
  • 13
  • 3
  • Your result from `connection.query()` is asynchronous. As such, the data is not yet available when your `retrieve()` function returns. You need to use promises or a callback to communicate the resulting asynchronous data back to the caller, not a simple return value. See the duplicate for a description of your options. – jfriend00 May 29 '16 at 09:27

1 Answers1

0
var data_model = {

    retrieve: function(cb) {

    connection.query('SELECT * FROM data_retrieve', function(err, rows, fields, data) {

            if (rows.length === 0) {

            } else {

                dataretrieve = {};

                dataretrieve["data_retrieve"] = {};

                dataretrieve["data_retrieve"] = {
                    id: rows[0].id,
                    msg: rows[0].msg
                };

                cb(JSON.stringify(dataretrieve));

            }

        });
    }
};

change code calling retrieve from

socket.emit("dataretrieve", JSON.stringify(data_model.retrieve()));

to

data_model.retrieve(function(data){
    socket.emit("dataretrieve",data);
})
gu mingfeng
  • 1,010
  • 8
  • 10