Javascript NodeJS函数执行命令
只需启动学习节点并尝试构建应用程序 现在在我的路由文件中,我试图连接到mysql,获取用户的主要信息,然后用它做其他事情。但是,当我执行网页时,控制台显示第二个日志的执行时间早于第一个日志。我想这可能是因为节点是异步的Javascript NodeJS函数执行命令,javascript,mysql,node.js,Javascript,Mysql,Node.js,只需启动学习节点并尝试构建应用程序 现在在我的路由文件中,我试图连接到mysql,获取用户的主要信息,然后用它做其他事情。但是,当我执行网页时,控制台显示第二个日志的执行时间早于第一个日志。我想这可能是因为节点是异步的 exports.list = function(req, res){ req.getConnection(function(err,connection){ /* find user's major */ var user_major = (function() {
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
您正面临这个问题,因为当调用堆栈到达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);
});
})();
});
};
正如其他人在评论中指出的,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
});
});
});
};
没错,这是因为它是异步的。你曾经使用过ajax吗?这是一个类似的想法。你需要了解异步编程是如何工作的<首先执行代码>外部测试。如果您想让异步代码更容易编写,请签出。我知道您只是在重新编写OP的代码,但这应该是检查
req.getConnection()
回调中是否发生错误。@MattBrowne我不希望OP复制并粘贴我的示例到生产代码中,但我还是添加了它。谢谢:)谢谢大家!!我花了几个小时研究异步的概念。这真的很棘手,但现在我有点明白了。谢谢你的回答!我喜欢你命名db函数的方式。非常有用=)