开始学习Node并尝试构建应用程序。
现在我的路径文件中我正在尝试连接到mysql并获取用户的主要部分,然后用它来做其他事情。但是,当我执行网页时,控制台显示第二个日志的执行时间早于第一个日志。我想这可能是因为Node是Async?
exports.list = function(req, res){
req.getConnection(function(err,connection){
/* find user's major */
var user_major = (function() {
connection.query('SELECT major FROM user WHERE user_id=' + req.params.id, function (err, row) {
if (err) {
console.log("Error Selecting : %s ", err);
}
console.log('Test inside function: '+ row[0].major);
return row[0].major;
});
})();
console.log("Test outside: " + user_major);
res.render('main/main',{page_title:'USER MAJOR', data: user_major});
});
};
终端日志:
Test outside: undefined
GET /main/1 304 353.737 ms - -
Test inside function: COEN
答案 0 :(得分:3)
正如其他人在评论中指出的那样,Node.js是异步的。您不能只从函数返回数据,它必须在回调中返回。
我按如下方式重写:
exports.list = function(req, res, next) {
req.getConnection(function(err, connection) {
if (err) return next(err);
/* find user's major */
var user_major = function(id, callback) {
connection.query('SELECT major FROM user WHERE user_id=' + id, function(err, row) {
if (err) {
return callback("Error Selecting : %s ", err);
}
callback(null, row[0].major);
});
};
user_major(req.params.id, function(error, major) {
if (error) return next(error);
res.render('main/main', {
page_title: 'USER MAJOR',
data: major
});
});
});
};
答案 1 :(得分:-1)
您遇到了问题,因为当调用堆栈到达console.log时,该值尚未返回,因为节点js是异步的。回调用于回调带有异步函数结果的回调函数。
exports.list = function(req, res){
req.getConnection(function(err,connection){
/* find user's major */
var callback = function(user_major){
console.log("1 Test outside: " + user_major);
res.render('main/main',{page_title:'USER MAJOR', data: user_major});
}
var db_call_for_user_major = (function(callback) {
connection.query('SELECT major FROM user WHERE user_id=' + req.params.id, function (err, row) {
if (err) {
console.log("Error Selecting : %s ", err);
}
console.log('test inside function: '+ row[0].major);
return callback(row[0].major);
});
})();
});
};