我想从这个异步函数exports.getServices中获取一个返回值。但是我什么也没得到/ null。
var http = require("http");
var mysql = require('mysql');
var url = require("url");
var connection = mysql.createConnection({
...
});
connection.connect();
exports.getServices = function (){
connection.query('SELECT DISTINCT SERVICE FROM booking_count', function(err, rows, fields) {
if (err) throw err;
var services = new Array();
for (var i in rows) {
services[i] = rows[i].SERVICE;
}
return services;
});
}
我从另一个模块访问此方法:
var express = require('express');
var hbs = require('express3-handlebars');
var app = express();
app.engine('html', hbs({defaultLayout: 'layout'}));
app.set('view engine', 'html');
app.set('views', __dirname + '\\views');
app.use(express.bodyParser());
var mysql = require('./mysql');
app.get('/', function(req, res) {
res.render('index',{title:"Services", services:mysql.getServices()});
});
app.get('/article/:id', function(req, res) {
var entry = blogEngine.getBlogEntry(req.params.id);
res.render('article',{title:entry.title, blog:entry});
});
app.listen(3000);
如果您可以发布更正的代码,那将非常有用。非常感谢你提前!
答案 0 :(得分:3)
您未提供有关哪个模块实施connection
的任何信息。此外,您还没有完全清楚哪个函数[getServices()
或传递给query()
的回调函数]没有返回任何内容。但是,我仍会尝试回答你的问题。
getServices()
函数永远不会返回任何内容 - 它只调用query()。所以,显然,你不能期望得到这样的结果:
var result = getServices(...);
回调函数确实返回一个值,但由于它是调用它的query()
函数,因此无法获得该返回值。此外,query()
可能无视任何返回值。
要解决此问题,您需要传递给getServices()
您自己的回调函数以接收结果。所以,你的实现看起来应该更像这样:
connection.connect();
exports.getServices = function (next) {
connection.query('SELECT DISTINCT SERVICE FROM booking_count', function(err, rows, fields) {
if (err) throw err;
var services = new Array();
for (var i in rows) {
services[i] = rows[i].SERVICE;
}
next(services);
});
}
但是,您应该弄清楚是否抛出错误(在原始回调中,当出现错误时)会导致问题(例如导致服务器崩溃)。您可能想要做其他事情:
connection.connect();
exports.getServices = function (next) {
connection.query('SELECT DISTINCT SERVICE FROM booking_count', function(err, rows, fields) {
if (err) return next(err); // Pass err to next, and immediately return.
var services = new Array();
for (var i in rows) {
services[i] = rows[i].SERVICE;
}
next(null, services); // Pass result to next (with no error).
});
}
欢迎来到异步函数式编程世界!