一尘不染

Node.js异步数据库功能需要同步回答

node.js

我是nodejs的新手,正在编写一些查询MySQL数据库并从给定的user_id返回用户名的代码。我一直在阅读,您所有的功能都应该是异步的。在这种情况下,理想情况下,我希望服务器能够在进行此查询时响应其他事件请求。但是,这不是一个特别大的查询,只返回一个值。也许我应该使其同步?(如果这是您的答案,那么更改示例代码将是不错的选择)无论如何,这是我的功能。它在最后一行“
return current_username;”附近给出错误。因为此时尚未定义current_username。有什么建议?

function get_current_username(current_user_id) {
    console.log(' | Entered get_current_username');
    sqlq = 'SELECT username FROM users WHERE id = ' + current_user_id;
    connection.query(sqlq, function(err, rows, fields) {
      if (err) throw err;
      var current_username = rows[0].username;
      console.log(' | the current_username =' + current_username);        
    });

return current_username;

}


阅读 243

收藏
2020-07-07

共1个答案

一尘不染

将回调函数传递给get_current_username,然后从connect.query的回调内部调用该回调函数:

function get_current_username(current_user_id, callback) {
    console.log(' | Entered get_current_username');
    sqlq = 'SELECT username FROM users WHERE id = ' + current_user_id;
    connection.query(sqlq, function(err, rows, fields) {
      if (err) throw err;
      var current_username = rows[0].username;
      console.log(' | the current_username =' + current_username);        
      callback(current_username);
    });
}

然后,当您使用此功能时,您将执行以下操作:

get_current_username(12345, function(username) {
   console.log("I am " + username);
});

您还可以查看对诺言/未来的使用。我有种无法解释这些正义的感觉,因此我将链接到有关理解Promises的问题)。

但是,这是一个体系结构决策-
有些人希望使用回调,尤其是在编写旨在供第三方重用的模块时。(实际上,在采用Promise之类的方法之前,最好在这里的学习阶段中全神贯注于回调。)

2020-07-07