等待与JS mysql包不按预期工作

时间:2019-04-07 19:34:38

标签: javascript mysql node.js async-await

我对Javascript / node很陌生,还不了解这个概念。下面的以下代码对我来说还不清楚。从数据库检索所有结果之前,我不希望显示“ END”。希望您不要告诉我将其放在行输出后面,并且确实有解决该问题的方法。我认为“等待”将使代码真正等待其处理完成。

const mysql = require('mysql'); // or use import if you use TS
const util = require('util');
const conn = mysql.createConnection({
    "host"     : "",
    "user"     : "",
    "password" : "",
    "database" : "",
});

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

(async () => {
  try {
    const rows = await query('select count(*) as count from table');
    console.log(rows);
  } finally {
    conn.end();
  }
})()

console.log("END");

谢谢

1 个答案:

答案 0 :(得分:-2)

您不能那样使用它。如果没有回调,mysql将改为流式传输结果,并且您需要使用on事件监听器。

根据文档:

  

流传输行时,您不得提供对query()方法的回调。

以这种方式,您需要添加事件并解决承诺:

async function myQueryFunction(str, replacements) {
  return new Promise(resolve => {
    let rows = []
    query(str, replacements)
      .on('result', (row) => {
        // Do something with the row
        rows.push(row)
      })
      .on('end', () => resolve(rows))
  })
}

否则,您需要使用回调函数来调用query方法,因此创建一个查询函数以解析诺言...

async function myQueryFunction(str, replacements) {
  return new Promise(resolve => {
    query(str, replacements, (err, rows) => {
      resolve(rows)
    })
  })
}

最后,您可以调用从上述示例之一创建的方法,如下所示:

(async () => {
  try {
    const rows = await myQueryFunction('select count(*) as count from table');
    console.log(rows);
  } finally {
    conn.end();
  }
})()