如何使用Node从mysql中正确返回结果?

Ken*_*ram 10 node.js

在代码中

var stuff_i_want = '';
stuff_i_want = get_info(parm);
Run Code Online (Sandbox Code Playgroud)

函数get_info:

get_info(data){
      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
            console.log(stuff_i_want); // Yep. Value assigned..
    }
Run Code Online (Sandbox Code Playgroud)

在更大的范围内

stuff_i_want = null
Run Code Online (Sandbox Code Playgroud)

关于返回mysql数据并将其分配给变量,我缺少什么?

============每个Alex建议的新代码

var parent_id = '';
    get_info(data, cb){
          var sql = "SELECT a from b where info = data"
          connection.query(sql, function(err, results){
                if (err){ 
                  throw err;
                }
                return cb(results[0].objid);  // Scope is larger than function
    }
Run Code Online (Sandbox Code Playgroud)

====新代码正在使用中

 get_data(parent_recording, function(result){ 
    parent_id = result;
    console.log("Parent ID: " + parent_id); // Data is delivered
  });
Run Code Online (Sandbox Code Playgroud)

然而

console.log("Parent ID: " + parent_id);
Run Code Online (Sandbox Code Playgroud)

在函数外部的范围内,parent_id为null

Ale*_*lex 14

您将需要了解异步调用和使用javascript的回调,这不是c#/ php等...

以下是使用您的代码的示例:

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
 });
Run Code Online (Sandbox Code Playgroud)

当你调用get_info它时,调用connection.query,它接受一个回调(那就是什么function(err, results)
范围然后传递给这个回调,依此类推.

欢迎来到javascript回调地狱......

当你掌握它时,它很容易,只需要习惯一点,来自C#之类的东西

  • 谢谢男人,2小时后终于找到了有意义的东西.来自PHP背景得说JS是一种难以理解的语言 (5认同)

Ken*_*ram 13

五年后,我对异步操作有了更好的理解。另外,使用 ES6 中 async/await 的新语法,我重构了这段特定的代码:

const mysql = require('mysql2') // built-in promise functionality
const DB = process.env.DATABASE
const conn = mysql.createConnection(DB)

async function getInfo(data){
  var sql = "SELECT a from b where info = data"
  const results = await conn.promise().query(sql)
  return results[0]
}

module.exports = {
  getInfo
}
Run Code Online (Sandbox Code Playgroud)

然后,无论何时需要这些数据,我都会将其包装在异步函数中,根据getInfo(data)需要调用并使用结果。


gtu*_*olo 9

我想您在这里真正想做的是返回一个Promise对象及其结果。这样,您就可以处理从DBMS检索数据的异步操作:获得结果后,就可以利用Promise resolve函数以某种方式“返回值” /“解决承诺”。

这是一个例子:

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);
            }
        }
    )}
)}
Run Code Online (Sandbox Code Playgroud)

在呼叫方,您可以使用该then功能来管理实现,并使用该catch功能来管理拒绝。

这是一个使用上面的代码的示例:

getEmployeeNames()
.then(function(results){
  render(results)
})
.catch(function(err){
  console.log("Promise rejection error: "+err);
})
Run Code Online (Sandbox Code Playgroud)

在这一点上,您可以为您的结果设置视图(实际上是作为对象数组返回的):

render = function(results){ for (var i in results) console.log(results[i].Name) }
Run Code Online (Sandbox Code Playgroud)

编辑 我将添加一个有关如何返回带有结果的HTML内容的基本示例,这是Node的一种典型情况。只需使用Promise的then功能来设置HTTP响应,然后在http:// localhost:3001上打开浏览器

require('http').createServer( function(req, res){
if(req.method == 'GET'){
    if(req.url == '/'){
        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)
Run Code Online (Sandbox Code Playgroud)