Escoltant marea (no té res a veure, però així indique preferències musicals ;)), he trobat la solució al problema dels posts anteriors. Resulta que la funció query del paquet és asíncrona, és a dir que no se pot saber quan s'executarà, però serà quan s'acabe la funció que la crida. Aleshores el que hem de fer és no retornar la resposta fins que no s'execute el callback. I així ens evitem el problema, si has estat seguint el post entendràs la consulta i tot:
function fservidor(request, response){
var resXML="<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?><resposta>";
function frequeston(){
// El codi 200 vol dir què la petició ha segut correcta, i enviem la resposta en text pla.
response.writeHead(200, {
'Content-Type': 'text/plain'
}); //end writehead
}//end frequeston
request.on("end", frequeston);
var client = mysql.createConnection('mysql://'+user + ':'+pass+'@'+server+'/'+database);
client.query("select * from personatges",function (err,result){
resXML+="<personatges><personatge><id>" + result[0].id + "</id></personatge></personatges>";
resXML+="</resposta>";
response.end(resXML);
}//callback query
);//query
}
var servidor = http.createServer(fservidor);
servidor.listen(10000);
Si ens fixem la línia en roig, (la resposta), està fins el callback, per tant ens assegurem que no es retornarà la resposta al client fins que no s'execute el callback. Això és així per què el servidor node.js té un únic fil, (al contrari, com per exemple php, que cada petició és un nou fil), i per cada petició s'execute una vegada fservidor() fins que acaba. Si mysql fora síncrona, i fora una consulta llarga (per exemple), el servidor quedaria colapsat fins que la petició a la base de dades es realitzara i no estaria realitzant cap procés. Així, retorna el control i pot atendre les següent peticions. Recordem node.js és un servidor orientat a events.
La resposta en l'exemple, òbviament no té molt de sentit lògic però si ilustratiu:
function fservidor(request, response){
var resXML="<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?><resposta>";
function frequeston(){
// El codi 200 vol dir què la petició ha segut correcta, i enviem la resposta en text pla.
response.writeHead(200, {
'Content-Type': 'text/plain'
}); //end writehead
}//end frequeston
request.on("end", frequeston);
var client = mysql.createConnection('mysql://'+user + ':'+pass+'@'+server+'/'+database);
client.query("select * from personatges",function (err,result){
resXML+="<personatges><personatge><id>" + result[0].id + "</id></personatge></personatges>";
resXML+="</resposta>";
response.end(resXML);
}//callback query
);//query
}
var servidor = http.createServer(fservidor);
servidor.listen(10000);
Si ens fixem la línia en roig, (la resposta), està fins el callback, per tant ens assegurem que no es retornarà la resposta al client fins que no s'execute el callback. Això és així per què el servidor node.js té un únic fil, (al contrari, com per exemple php, que cada petició és un nou fil), i per cada petició s'execute una vegada fservidor() fins que acaba. Si mysql fora síncrona, i fora una consulta llarga (per exemple), el servidor quedaria colapsat fins que la petició a la base de dades es realitzara i no estaria realitzant cap procés. Així, retorna el control i pot atendre les següent peticions. Recordem node.js és un servidor orientat a events.
La resposta en l'exemple, òbviament no té molt de sentit lògic però si ilustratiu:
<?xml version="1.0" encoding="ISO-8859-1"?>
<resposta><personatges><personatge><id>1</id></personatge>
</personatges></resposta>
Comentaris
Publica un comentari a l'entrada