我们如何使用Async,以及nodeJS中最好的方法是什么

时间:2017-04-30 03:53:58

标签: javascript node.js express asynchronous node-mysql

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

如何设置等待请求?

我的数据库连接

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

2 个答案:

答案 0 :(得分:2)

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

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);
});

答案 1 :(得分:2)

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

如果您不熟悉这个概念,我强烈建议您使用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");
}

你可以看到已经有更多的东西了,如果你需要建立它的话还有更多。在回调驱动代码中插入可选步骤棘手

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

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在错误处理中修补错误处理也是微不足道的。