La función de llamada llama a la función asíncrona wcNam2Uid2 para devolver un nombre. Luego, la persona que llama console.log el retorno (nombre).
La consola.log es:
Enter nam2userid , input:Tommy Leung in main, resolve result : undefined result id :tommyleung nam2userid resolved , wc_id : tommyleung "Mi main.js es:
var express = require('express'); async function caller(snam) { //console.log(" main start with: "+ snam); const uid = await wcNam2Uid2(snam); console.log(" in main, resolve result : " + uid); } let wcname ="Tommy Leung"; caller(wcname);El código en la función wcNam2Uid2
async function wcNam2Uid2(wcname ) { //return data var myJson =""; var mysql = require('mysql'); var fs = require('fs'); var bodyParser = require('body-parser'); var mnam = wcname; console.log("Enter nam2userid , input:" + mnam ); //wcname; var con = mysql.createConnection({ host: "localhost", user: "root", password: "", database: "crm" }); // select leads by name con.connect(function(err) { if (err) throw err; con.query("SELECT wc_id FROM wcdirlist where name = '" + mnam + "' ", function (err, result, fields) { setTimeout(() => { if (err) throw err; console.log("result id :"+ result[0].wc_id); var wcid = result[0].wc_id; con.end; console.log(" nam2userid resolved , wc_id : " + wcid); return wcid; },2000); }); }); }Los extractos del final son la preocupación (arriba se está ejecutando).
console.log(" nam2userid resolved , wc_id : " + wcid); return wcid; Como puede ver, la primera línea es buena, ya que se mostró correctamente en console.log, pero la siguiente línea "return wcid" falló.
La segunda línea en console.log donde la respuesta de la persona que llama a la función salió demasiado pronto es el problema, supongo que esperar no está funcionando.
Evitaría el tiempo de espera establecido y haría lo que hizo en la primera función, envolvería el código en la función asíncrona y esperaría el resultado
Estudié dentro de stackflow y un artículo parecía la solución usando devolución de llamada. El enlace de devolución de llamada: Node.js que devuelve el resultado de la consulta MySQL
Mis codigos:
function getwcid(uname, callback) { const mysql = require("mysql"); const con = mysql.createConnection({ host: "localhost", user: "root", password: "", database: "crm" }); con.query( "SELECT wc_id FROM wcdirlist WHERE name = '"+ uname +"'", function(err, result) { if (err) callback(err,null); else callback(null,result[0].wc_id); }); return } //call Fn for db query with callback getwcid("Tommy Leung", function(err,data){ if (err) { // error handling code goes here console.log("ERROR : ",err); } else { // code to execute on data retrieval console.log("result from db is : ",data); } }); return;La consola.log:
C:\Users\Lenovo\eclipse-workspace\.metadata\.plugins\org.eclipse.wildwebdeveloper.embedder.node\node-v14.15.4-win-x64\node.exe test_getwcid_3.js result from db is : tommyleungLa respuesta por devolución de llamada es muy simple y ¿alguien tiene una respuesta más corta por espera?