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

我试图传递一个查询到我的数据库,然后将结果发送到我的客户端,但它看起来像请求是asynchronous的,因为我的请求发生后,我的发布请求返回值。

如何设置等待请求?

我的数据库连接

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函数的实现以返回一个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); }); 

欢迎来到Node.js,其中的一切都是asynchronous的,除非您以一种将事件级联到另一个事件的方式来显式地构造代码,否则代码中没有义务依照任何特定的顺序运行。

如果你不熟悉这个概念,我强烈build议selectPromise作为组织代码的一种方式。 这样做会把许多棘手的节目编排成一些简洁而整齐的方法,并且使链接,扇出和扇入其实非常简单。

例如,用Sequelize重写一个使用承诺的数据库层:

 function queryDatabase(userQuery){ console.log("before"); return connection.query(userQuery); } 

回来的承诺,这是用来链。 如果你不这样做,你必须接受一个callback参数并链接。 返回值很大程度上被忽略:

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

你可以看到已经有更多的东西了,如果你需要build立更多的东西,那更多。 在callback驱动代码中插入可选步骤是棘手的

承诺让你的代码看起来像这样:

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

在一个地方用error handlingerror handling来处理错误也是微不足道的。