这是我对NodeJS的第一次挑战,我认为我对所有回调和异步内容都有点迷失。
我有一台服务器,使用express并希望其中一个请求将查询数据库并返回结果。
使用任何其他语言,我会写一个这样做的函数,返回值,一切都会很好。 我的代码看起来像这样:
function queryDB(daysAgo){
var connection = mysql.createConnection({
host: "dbadress.com",
user: "dbuser",
password: "dbpassword",
database: "db"
});
var returnValue;
sqlQuery = "select * from db.database where time_created > now() - interval " + daysAgo + " day"
connection.query(sqlQuery, function(error, results, fields){
if (error) throw error;
returnValue= results[0];
});
return returnValue;
}
app.get('/', function (req, res){
var daysAgo = req.query.days_ago;
var returnValue = queryMICE(daysAgo);
res.send("Days Ago: '+ daysAgo + '\nTargeted URL: ' + returnValue);
});
当然返回undefined
因为queryDB
函数不同步。
很高兴得到关于NodeJS中回调的简短介绍,并举例说明如何编写此回调以返回查询值。
提前致谢!
答案 0 :(得分:1)
不是让 queryDB 返回值,而是将回调函数传递给接收返回值的函数,如下所示:
function queryDB(daysAgo, callback) {
var connection = mysql.createConnection({
host: "dbadress.com",
user: "dbuser",
password: "dbpassword",
database: "db"
});
sqlQuery = "select * from db.database where time_created > now() - interval " + daysAgo + " day";
connection.query(sqlQuery, function (error, results, fields) {
if (error) {
throw error;
}
callback(results[0]);
});
}
app.get('/', function (req, res) {
var daysAgo = req.query.days_ago;
queryDB(daysAgo, returnValue => res.send("Days Ago: " + daysAgo + '\nTargeted URL: ' + returnValue));
});
作为旁注:通过连接请求参数来创建SQL查询是 extremeley dangerous 。你应该从不在生产中使用这样的代码,但这是另一个故事。谷歌为“SQL注入”了解更多信息。