我正在尝试将一些复杂性重构为一个名为getData的函数,但调用此函数的代码似乎没有得到结果。
function getData(sql) {
pool.getConnection(function(err, connection) {
if (err) return;
connection.query(sql, function(err, rows) {
if (err) return;
if (rows.length > 0) {
console.log(rows); // This outputs result from table
return rows;
} else {
return [{"error":"Not found"}];
}
});
connection.end();
});
}
然而,当从这样的函数调用它时,我得到未定义的返回,即使函数内部的代码工作正常。
app.get('/1/employees/past', function(req, res, next) {
var rows = getData("select * from users");
res.json(rows);
})
答案 0 :(得分:5)
你的return
从内部函数返回,这不会影响外部函数。
您需要捕获它并将其返回,并且看到它似乎与回调一起使用时,您需要将额外的回调传递给getData()
。
像这样......
function getData(sql, callback) {
// ...
connection.query(sql, function(err, rows) {
// ...
callback && callback(rows); // etc
});
// ...
}
如果您希望更安全,请确保回调通过typeof
实施[[Call]]
(链接到我自己的博文)。
答案 1 :(得分:0)
getData
函数没有返回任何内容! <{1}}函数内部的getConnection
函数正在调用一个函数,该函数调用返回某个函数的函数; getData
函数本身没有返回任何内容。
更重要的是,如果此代码异步执行,所有返回将在getData
函数返回后很长时间执行。
你要么采用同步getData
路由还是异步回调路由,你不能混合使用这两种风格。
答案 2 :(得分:0)
您的getData
函数不返回任何内容 - 代码中的return语句全部用于您传递到connection.query
和connection.query
的匿名函数。
您的连接相关功能是异步的 - 即它们在您调用它们之后立即返回,而不等待任何结果可用。如果你想对返回的结果做一些事情,你需要在其中一个匿名函数中执行,而不是在getData
完成后立即执行。