我有以下函数从数据库中获取十六进制代码
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
答案 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。