node.js async/await与MySQL一起使用

Bur*_*gin 14 javascript mysql asynchronous node.js

我需要将所有结果同步并附加到带有async/await关键字的字符串,例如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){};
            string3 = result;   
        });

        connection.query(query,function (err, result) {
            if (err){};
            string4 = 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;
});
Run Code Online (Sandbox Code Playgroud)

LeO*_* Li 22

如果您碰巧在Node 8+中,您可以利用util.promisify()节点mysql 的本机.

不要忘记给它打电话,bind()这样this就不会搞砸了:

const mysql = require('mysql'); // or use import if you use TS
const util = require('util');
const conn = mysql.createConnection({yourHOST/USER/PW/DB});

// node native promisify
const query = util.promisify(conn.query).bind(conn);

(async () => {
  try {
    const rows = await query('select count(*) as count from file_managed');
    console.log(rows);
  } finally {
    conn.end();
  }
})()
Run Code Online (Sandbox Code Playgroud)

  • 感谢您添加绑定的说明。我花了很长时间来尝试弄清为什么我在promisify中遇到问题。 (2认同)

mr_*_*all 17

使用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]);
}
Run Code Online (Sandbox Code Playgroud)

  • 这是最好的答案... 天啊 Mysql2 比 mysql *快得多*,并且提供了大量 mysql 没有的东西,比如承诺和压缩以及准备好的语句。 (7认同)
  • 使用await conn.end()执行查询后不要忘记结束连接;或者更好地使用池而不是像 createPool 和结束池这样的连接。 (4认同)

ada*_*eck 12

假设您正在使用它的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
  }
}
Run Code Online (Sandbox Code Playgroud)

任何承诺都可以通过放在await调用前与async/await一起使用.但请注意,函数必须在async函数"包装器"中使用.您需要处理try/catch块中的错误.

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


Ale*_*lke 6

如果您想使用 mysql(也称为 mysqljs),并且不想使用包装器,则必须做一些工作。但这很容易。连接函数如下所示:

const mysql = require('mysql')

var my_connection = mysql.createConnection({ ... })

async function connect()
{
    try
    {
        await new Promise((resolve, reject) => {
            my_connection.connect(err => {
                return err ? reject(err) : resolve()
            })
        })
    }
    catch(err)
    {
        ...handle errors...
    }
}

connect()
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,等待将知道如何处理承诺。您创建此类并在回调实现中使用解析/拒绝函数。实际上,这就是它的全部内容,因此使用包装器可能会有点麻烦,除非您经常访问数据库。