Solución:
Necesitará familiarizarse con las llamadas asíncronas y las devoluciones de llamada con javascript, esto no es C #, PHP, etc.
Aquí tienes un ejemplo usando tu código:
function get_info(data, callback){
var sql = "SELECT a from b where info = data";
connection.query(sql, function(err, results){
if (err){
throw err;
}
console.log(results[0].objid); // good
stuff_i_want = results[0].objid; // Scope is larger than function
return callback(results[0].objid);
})
}
//usage
var stuff_i_want="";
get_info(parm, function(result){
stuff_i_want = result;
//rest of your code goes in here
});
Cuando usted llama get_info
esto, a su vez, llama a connection.query, que recibe una devolución de llamada (eso es lo que function(err, results)
es
Luego, el alcance se pasa a esta devolución de llamada, y así sucesivamente.
Bienvenido al infierno de devolución de llamada javascript …
Es fácil cuando aprendes a hacerlo, solo toma un poco de tiempo acostumbrarte, viniendo de algo como C #
Supongo que lo que realmente desea hacer aquí es devolver un objeto Promise con los resultados. De esta manera puede lidiar con la operación asincrónica de recuperar datos del DBMS: cuando tiene los resultados, hace uso de la Promesa resolver función para de alguna manera “devolver el valor” https://foroayuda.es/ “resolver la promesa”.
He aquí un ejemplo:
getEmployeeNames = function(){
return new Promise(function(resolve, reject){
connection.query(
"SELECT Name, Surname FROM Employee",
function(err, rows){
if(rows === undefined){
reject(new Error("Error rows is undefined"));
}else{
resolve(rows);
}
}
)}
)}
En el lado de la persona que llama, usa el then
función para gestionar el cumplimiento, y la catch
función para gestionar el rechazo.
A continuación, se muestra un ejemplo que utiliza el código anterior:
getEmployeeNames()
.then(function(results){
render(results)
})
.catch(function(err){
console.log("Promise rejection error: "+err);
})
En este punto, puede configurar la vista para sus resultados (que de hecho se devuelven como una matriz de objetos):
render = function(results){ for (var i in results) console.log(results[i].Name) }
Editar
Estoy agregando un ejemplo básico sobre cómo devolver contenido HTML con los resultados, que es un escenario más típico para Node. Solo usa el then
función de la promesa para establecer la respuesta HTTP, y abra su navegador en http: // localhost: 3001
require('http').createServer( function(req, res){
if(req.method == 'GET'){
if(req.url == "https://foroayuda.es/"){
res.setHeader('Content-type', 'text/html');
getEmployeeNames()
.then(function(results){
html = "<h2>"+results.length+" employees found</h2>"
html += "<ul>"
for (var i in results) html += "<li>" + results[i].Name + " " +results[i].Surname + "</li>";
html += "</ul>"
res.end(html);
})
.catch(function(err){
console.log("Promise rejection error: "+err);
res.end("<h1>ERROR</h1>")
})
}
}
}).listen(3001)