Node.js返回MySQL查询的结果

时间:2013-08-21 15:42:50

标签: mysql node.js callback

我有以下函数从数据库中获取十六进制代码

function getColour(username, roomCount)
{
    connection.query('SELECT hexcode FROM colours WHERE precedence = ?', [roomCount], function(err, result)
    {
        if (err) throw err;
        return result[0].hexcode;
    });
}

我的问题是我在回调函数中返回结果,但getColour函数没有返回任何内容。我希望getColour函数返回result[0].hexcode的值。

在我调用getColour时,它不会返回任何内容

我尝试过像

这样的事情
function getColour(username, roomCount)
{
    var colour = '';
    connection.query('SELECT hexcode FROM colours WHERE precedence = ?', [roomCount], function(err, result)
    {
        if (err) throw err;
        colour = result[0].hexcode;
    });
    return colour;
}

但当然SELECT查询在返回colour

中的值时已经完成

2 个答案:

答案 0 :(得分:50)

您必须仅在回调上对db查询的结果进行处理。就像。

function getColour(username, roomCount, callback)
{
    connection.query('SELECT hexcode FROM colours WHERE precedence = ?', [roomCount], function(err, result)
    {
        if (err) 
            callback(err,null);
        else
            callback(null,result[0].hexcode);

    });

}

//call Fn for db query with callback
getColour("yourname",4, 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);   
        }    

});

答案 1 :(得分:0)

如果您想使用 promise (承诺)来避免所谓的“回调地狱” ,则有多种方法。

这是一个使用本地承诺和标准MySQL package的示例。

const mysql = require("mysql");

//left here for testing purposes, although there is only one colour in DB
const connection = mysql.createConnection({
  host: "remotemysql.com",
  user: "aKlLAqAfXH",
  password: "PZKuFVGRQD",
  database: "aKlLAqAfXH"
});

(async () => {
  connection.connect();
  const result = await getColour("username", 2);
  console.log(result);
  connection.end();
})();

function getColour(username, roomCount) {
  return new Promise((resolve, reject) => {
    connection.query(
      "SELECT hexcode FROM colours WHERE precedence = ?",
      [roomCount],
      (err, result) => {
        return err ? reject(err) : resolve(result[0].hexcode);
      }
    );
  });
}

在异步函数中,您可以使用 await 表达式,该表达式将暂停函数执行,直到解决或拒绝Promise为止。这样,getColour函数将通过MySQL查询返回一个Promise,它将暂停主函数的执行,直到返回结果或引发查询错误为止。

一种类似但可能更灵活的方法可能是使用MySQL库的promise wrapper package甚至基于诺言的ORM。