2013-12-12 12 views
12

Chciałbym użyć node.js do wysłania zapytania do bazy danych mySQL i zwrócenia wyników jako JSON do użycia w aplikacji mobilnej. Niestety, moja prośba kończy się w zwykły sposób, a serwer nie robi nic przez dobre 2 minuty, dopóki pliki logów nie będą zawierały moich-console.log() -zapisów.node.js + wynik MySQL i JSON - błąd wywołania zwrotnego i brak odpowiedzi na klienta

Również wywołanie zwrotne nie zwraca niczego jako wyniku. Jest po prostu pusty.

// Check dependencies 
var http = require('http'); 
// Create the http server. 
// reference: http://net.tutsplus.com/tutorials/javascript-ajax/node-js-for-beginners/ 
http.createServer(function(request, response) { 
    // Attach listener on end event. 
    request.on('close', function() { 
     console.log('request'); 

     // run asynchronous 
     getSQL(function(err, result) { 
      console.log('json:', result); 
      response.writeHead(200, { 
       'Content-Type' : 'x-application/json' 
      }); 
      // Send data as JSON string. 
      response.end(result); 
     }); 
    }); 
}).listen(3000); 

// Access MySQL via node-mysql 
// https://github.com/felixge/node-mysql 
function getSQL(callback) { 
    var mysql = require('mysql'); 
    var connection = mysql.createConnection({ 
     host : 'localhost', 
     user : 'user', 
     password : 'pw', 
     database : 'db', 
     socketPath : '/var/run/mysqld/mysqld.sock', // socket for communication from debian <-> client, seems not to be set correcly by default? 
    }); 

    connection.connect(); 
    var json = ''; 
    var query = 'SELECT * FROM test'; 
    connection.query(query, function(err, results, fields) { 
     if (err) 
      return callback(err, null); 

     console.log('The result is: ', results[0]); 

     // wrap result-set as json 
     json = JSON.stringify(results); 
    }); 
    connection.end(); 

    callback(null, json); 
}; 

wyjścia jak po 2 minuty:

$ node app.js 
request 
json: 
The result is: { test: 'avc' } 
json2: [{"test":"avc"}] 

podstawie mojego bardzo podstawowego zrozumienia całego node.js-pojęcia, mój kod powinien kwerendy db (to robi) i zwraca json raz jest zakończona przez funkcję zwrotną (podobno nie jest), która jest wysyłana z powrotem jako odpowiedź do klienta (nie można tego sprawdzić, ponieważ json jest pusty).

Zgaduję, że popełniłem jeden (lub kilka) głównych błędów. Pomoc i/lub pomocne linki będą mile widziane. Dzięki!

Solution, dzięki hexacyanide

// Check dependencies 
var http = require('http'); 
// Create the http server. 
// reference: http://net.tutsplus.com/tutorials/javascript-ajax/node-js-for-beginners/ 

/*************** 
* Correction 1: Using the request.on('close', function()(...)-listener isn't required anymore 
***************/ 
http.createServer(function(req, res) { 
    console.log('Receving request...'); 
    var callback = function(err, result) { 
     res.writeHead(200, { 
      'Content-Type' : 'x-application/json' 
     }); 
     console.log('json:', result); 
     res.end(result); 
    }; 

    getSQL(callback); 

}).listen(3000); 

// Access MySQL via node-mysql 
// https://github.com/felixge/node-mysql 
function getSQL(callback) { 
    var mysql = require('mysql'); 
    var connection = mysql.createConnection({ 
     host : 'localhost', 
     user : 'user', 
     password : 'pw', 
     database : 'db', 
     socketPath : '/var/run/mysqld/mysqld.sock', // socket for communication from debian <-> client, seems not to be set correcly by default? 
    }); 

    connection.connect(); 
    var json = ''; 
    var query = 'SELECT * FROM test'; 
    connection.query(query, function(err, results, fields) { 
     if (err) 
      return callback(err, null); 

     console.log('The query-result is: ', results[0]); 

     // wrap result-set as json 
     json = JSON.stringify(results); 

     /*************** 
     * Correction 2: Nest the callback correctly! 
     ***************/ 
     connection.end(); 
     console.log('JSON-result:', json); 
     callback(null, json); 
    }); 
}; 
+3

+1 thx, szukał dokładnie tym przykładzie – Thariama

+0

@Thariama zgodził, to jest właśnie nad tym pracowałem. –

Odpowiedz

9

Obserwujesz starszą przewodnik, który zaleci czekać na żądanie za close razie przed wysłaniem odpowiedzi, ale w rzeczywistości nie muszą już tego robić.

To, co się dzieje, to nie wysyłanie odpowiedzi, więc Twój klient traci czas. Dopóki klient nie przekroczy limitu czasu, zdarzenia są uruchamiane. Ponieważ klient rozłączył się po wysłaniu odpowiedzi, nie dostaniesz niczego na kliencie i widzisz go tylko w terminalu.

Aby rozwiązać ten problem, po prostu zatrzymać czekając na ścisłej zdarzeń i uruchomić kod natychmiast po obsługi żądania nazywa się:

var http = require('http'); 
http.createServer(function(req, res) { 
    getSQL(function(err, result) { 
    res.writeHead(200, { 
     'Content-Type' : 'x-application/json' 
    }); 
    res.end(result); 
    }); 
}).listen(3000); 
+3

Dziękuję bardzo, działa świetnie! Pewnie zabrałoby mi dziesiątki lat, żeby to zrozumieć. –

Powiązane problemy