node.jsasynchronous/等待使用MySQL

我需要获得所有结果同步,并追加到一个string与asynchronous/等待关键字,如C#

我是新的node.js,我不能适应这个新的语法我的代码。

var string1 = ''; var string2 = ''; var string3 = ''; var string4 = ''; DatabasePool.getConnection(function(err, connection) { connection.query(query,function (err, result) { if (err){}; string1 = result; }); connection.query(query,function (err, result) { if (err){}; string2 = result; }); connection.query(query,function (err, result) { if (err){}; string2 = result; }); connection.query(query,function (err, result) { if (err){}; string2 = result; }); // i need to append all these strings to appended_text but // all variables remain blank because below code runs first. var appended_text = string1 + string2 + string3 + string4; }); 

假设你正在使用它的ORM,你可以做这样的事情

 async function buildString() { try { const connection = await DatabasePool.getConnection(); const string1 = await connection.query(query); const string2 = await connection.query(query); const string3 = await connection.query(query); const string4 = await connection.query(query); return string1 + string2 + string3 + string4; } catch (err) { // do something } } 

任何承诺都可以通过在呼叫前面等待来使用asynchronous/等待。 但是,请注意, 函数必须在async函数“包装器”中使用。 你需要处理try/catch块中的错误。

我也想指出,这4个查询不是同时运行的。 你仍然需要使用Promise.all。

使用mysql2包。 它承诺包装,所以你可以这样做:

 async function example1 () { const mysql = require('mysql2/promise'); const conn = await mysql.createConnection({ database: test }); let [rows, fields] = await conn.execute('select ?+? as sum', [2, 2]); } 

你将不得不确保你使用的mysql库支持async / await所需的Promises,或者使用像Bluebird的promisifyAll这样的工具来封装库。

 async function appendedText() { const connection = await DatabasePool.getConnectionAsync(); const [string1, string2, string3, string4] = await [ connection.query(query1), connection.query(query2), connection.query(query3), connection.query(query4), ]; return string1 + string2 + string3 + string4; } 

请注意,调用appendedText()实际上会返回一个Promise而不是一个值。

 appendedText().then(appended_text => {});