node.js + MySQL & amp; JSON-result - Problème de rappel & amp; pas de réponse au client
Je voudrais utiliser node.js pour interroger une base de données mySQL-base de données et renvoie les résultats sous forme de JSON pour être utilisé dans une application mobile. Malheureusement, ma demande juste sorta fois et le serveur ne fait rien pour un bon 2 minutes jusqu'à ce que les fichiers log montrer mon console.log()
-états.
Aussi, le rappel ne retourne rien comme résultat. C'est tout simplement vide.
//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);
};
Sortie après 2 minutes:
$ node app.js
request
json:
The result is: { test: 'avc' }
json2: [{"test":"avc"}]
Basé sur ma connaissance de base de l'ensemble de nœud.js-concept, mon code doit interroger la bd (il le fait), et un retour json une fois qu'il est terminé par le rappel de la fonction (apparemment ne fait pas) qui est envoyé à l'arrière comme une réponse au client (ne peut pas vraiment vérifier que, depuis le json est vide).
Je suppose que j'en ai fait une ou plusieurs erreurs majeures. Aide et/ou liens utiles serait très apprécié. Merci!
Solution, grâce à 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);
});
};
source d'informationauteur otter-in-a-suit
Vous devez vous connecter pour publier un commentaire.
Vous êtes un vieux guide qui vous demande d'attendre la demande du
close
événement avant l'envoi de la réponse, mais en fait vous n'avez plus besoin de le faire.Ce qui se passe est que vous n'êtes pas d'envoyer votre réponse, de sorte que votre client est le moment de sortir. Seulement jusqu'à ce que le client arrive à expiration, c'est quand
close
événements incendies. Depuis le client s'est déconnecté au moment où vous envoyez votre réponse, vous n'avez pas obtenir quoi que ce soit sur le client et ne vois que ça dans le terminal.Pour résoudre ce problème, il suffit de cesser d'attendre la clôture de l'événement et d'exécuter du code lorsque la demande de gestionnaire est appelé: