繁体   English   中英

我们如何使用异步,以及nodeJS的最佳方法是什么

[英]How do we use Async, and what is the best way in nodeJS

我正在尝试将查询传递到数据库,然后将结果发送到客户端,但是看起来请求是异步的,因为我的请求发生在发布请求返回值之后。

如何设置等待请求?

我的数据库连接

var connection = mysql.createConnection({
    host: 'localhost',
    user: 'root',
    password: 'my_password',
    database: 'MEETME'
});

connection.connect(function(err) {
    if (err) {
        console.log("error while connecting to database");
        console.log(err.code);
    }
});

// function that query database <-------

function queryDatabase(userQuery) {
    connection.query(userQuery, function(err, result) {
        if (err) {
            throw err;
        }
        console.log("before");
        return result;
    });
}

这是我的帖子请求

//POST
app.post('/signin', function(request, response) {
    var query = queryDatabase("SELECT EMAIL FROM MEMBER WHERE ID_MEMBER = 3");
    console.log(query);
    console.log("after");
    response.end(query, 200);
});

控制台中的结果是:

undefined
after
before

更改queryDatabase函数的实现以返回承诺。 可以等待任何返回诺言的函数。

function queryDatabase(userQuery){
     return new Promise((resolve,reject) => {
        connection.query(userQuery, function(err, result){
            if(err){
              reject(err);
            }
            console.log("before");
            resolve(result);
        }); 
     }); 
}



app.post('/signin', async function(request, response){
    var query = await queryDatabase("SELECT EMAIL FROM MEMBER WHERE ID_MEMBER = 3");
    console.log(query);
    console.log("after");
    response.end(query, 200);
});

欢迎使用Node.js,这里的所有内容都是异步的,除非您以将一个事件级联到另一个事件的方式显式构造代码,否则代码部分没有义务以任何特定顺序运行。

如果您不熟悉此概念,我强烈建议您选择Promises作为组织代码的一种方式。 这将许多棘手的程序包装成一些整洁的方法,并使链接,扇出和扇入实际上非常简单。

例如,用Sequelize重写,该数据库层使用promises:

function queryDatabase(userQuery){
   console.log("before");

   return connection.query(userQuery);
}

退还诺言,该诺言已被链接起来。 如果不这样做,则必须接受回调参数并将其链接在一起。 返回值在很大程度上被忽略:

function queryDatabase(userQuery, cb){
   connection.query(userQuery, function(err, result){
      cb(err, result);
   });
   console.log("before");
}

您可以看到已经有更多的废纸if,如果需要在此基础上增加更多的废纸cru。 在回调驱动的代码中插入可选步骤很棘手

承诺使您的代码最终看起来像这样:

app.post('/signin', function(request, response){
  queryDatabase("SELECT EMAIL FROM MEMBER WHERE ID_MEMBER = 3")
    .then(function(results) {
      console.log(results);
      console.log("after");
      response.end(query, 200);
    });
});

在一处修补错误并用catch来处理错误也很简单。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM