我试图使用nodejs从mysql表中获取数据。我调用另一个节点js文件中的sql例程。但是,我无法让我的回调返回数据。我认为问题可能是我从节点js文件而不是从角度或常规javascript程序调用异步例程。下面是我正在调用的导出脚本。
exports.getVenueById = function(db, id) {
var http = require('http');
var mysql = require('mysql');
var query = "SELECT * FROM venues WHERE auto_increment = ? "
query = mysql.format(query, id);
console.log("query=" + query);
db.query(
query,
function(err, rows) {
if(err) console.log("error=" + err);
console.log("rows=" + rows[0]['auto_increment']);
res.json({success: true, response: rows});
//return rows[0];
});
}
我知道这是有效的,因为我正在将结果写入控制台。问题是数据永远不会回到下面的调用节点js例程。
function getVenueData (id , callback) {
(function () {
venueData = venueTable.getVenueById(db, id);
if(venueData) {
callback();
console.log("callback in loop");
}
console.log("callback after loop");
});
}
getVenueData(id, gotVenueData);
程序立即返回并显示超时消息。我承认我不是nodejs或其回调功能的专家。对于如何让程序等待异步数据返回调用程序,我将不胜感激。
function gotVenueData() {
console.log("gotVenueData");
}
setTimeout(function() { console.log("timeout for 10 seconds");} , 10000);
console.log("venuedata=" + venueData);
答案 0 :(得分:4)
您正在尝试同步返回异步数据。相反,添加一个回调到getVenueById:
exports.getVenueById = function(db,id,cb){ var http = require('http'); var mysql = require('mysql');
var query = "SELECT * FROM venues WHERE auto_increment = ? ";
query = mysql.format(query, id);
console.log("query=" + query);
db.query(
query,
function (err, rows) {
if (err) console.log("error=" + err);
console.log("rows=" + rows[0]['auto_increment']);
cb({
success: true,
response: rows
});
// return rows[0];
});
并使用它:
venueTable.getVenueById(db, id, function(data) {
console.log(data);
});
一个警告:传统上,回调的第一个参数是错误(或null
),然后是实际数据。考虑到这一点:
exports.getVenueById = function(db,id,cb){ var http = require('http'); var mysql = require('mysql');
var query = "SELECT * FROM venues WHERE auto_increment = ? ";
query = mysql.format(query, id);
console.log("query=" + query);
db.query(
query,
function (err, rows) {
if (err) { cb(err); }
console.log("rows=" + rows[0]['auto_increment']);
cb(null, {
success: true,
response: rows
});
// return rows[0];
});
并使用它:
venueTable.getVenueById(db, id, function(err, data) {
if (err) { return console.log(err); }
console.log(data);
});