Node.js 为什么我的函数会丢失其返回值?

Node.js 为什么我的函数会丢失其返回值?,node.js,backend,Node.js,Backend,下午好,我正在学习nodeJS。现在我设计的一个函数有问题,我似乎找不到问题 var http = require('http'); var mysql = require('mysql'); var url = require('url'); http.createServer(function (req, res) { if (req.url === '/favicon.ico') { //res.writeHead(200, {'Content-Type': 'image/x-i

下午好,我正在学习nodeJS。现在我设计的一个函数有问题,我似乎找不到问题

var http = require('http');
var mysql = require('mysql');
var url = require('url');
http.createServer(function (req, res) {

if (req.url === '/favicon.ico') {
    //res.writeHead(200, {'Content-Type': 'image/x-icon'} );
    res.end();
    //console.log('favicon requested');
    return;
  }

var con = mysql.createConnection({
host: "localhost",
user: "admin",
password: "admin",
database: "brandibDB"
});
res.writeHead(200, {'Content-Type': 'text/plain'});
var addr = url.parse(req.url, true);
var teste = addr.pathname.split('/');
var tester = getJson(teste,con);
console.log(tester);
//console.log(teste);
//res.write(teste[1] + teste[2]);

res.end();

}).listen(8080);

function getJson(teste,con){
var resultado = "";

con.connect(function(err){
    if (err) throw err;

    if(teste[1] == 'users'){
        if(teste.length!=2){
            var str = "SELECT * FROM tblUsers where id ="+ mysql.escape(teste[2]) + "";
            con.query(str, function (err, result, fields) {
                if (err) throw err;
                resultado = JSON.stringify(result);
              });
        }
        else{
            var str = "SELECT * FROM tblUsers";
            con.query(str, function (err, result, fields) {
                if (err) throw err;
                resultado = JSON.stringify(result);
            });
        }
    }

});

con.end;
return resultado;
}

console.log('Isto deve ser uma consola');
现在我在数据库中有数据,我正在测试使用url“localhost:8080/users/1”或“localhost:8080/users/”访问此服务器 例如,当我运行第二个链接时,它应该进入函数getJson并返回正确的值(一个包含所有用户注册表的json),但它只返回空值。我尝试将控制台日志放在函数中的“resultado=Json…”行附近,它会显示正确的值。结果后来就失去了


有什么提示吗?

这是因为在查询的异步回调完成之前,getJson函数已经返回,因此resultado仍然是一个空字符串

相反,您可以提供对getJson的回调,在查询返回时调用该回调,或者更好的做法是使用承诺。大概是这样的:

  var tester = getJson(teste, con)
  .then(result => {
    console.log('the results were:', results)
  })
  .catch(err => {
    console.log('Something went wrong', err);
  });
你的函数变成了这样:

function getJson(teste, con) {
  return new Promise((resolve, reject) => {
    con.connect(function (err) {
      if (err) throw err;

      if (teste[1] == 'users') {
        if (teste.length != 2) {
          var str = "SELECT * FROM tblUsers where id =" + mysql.escape(teste[2]) + "";
          con.query(str, function (err, result, fields) {
            if (err) return reject(err);
            return resolve(JSON.stringify(result));
          });
        } else {
          var str = "SELECT * FROM tblUsers";
          con.query(str, function (err, result, fields) {
            if (err) return reject(err);
            return resolve(JSON.stringify(result));
          });
        }
      }
    });  
  })
}

我还建议放弃var并使用let和const,这样更容易跟踪变量作用域。

好奇,为什么要投反对票?不是我,从我的角度来说,谢谢,你帮助了我@罗斯·康登