在节点js中使用await,但是似乎不起作用

时间:2018-08-25 12:58:56

标签: node.js

我想在console.log中的“ myJson”之前显示“ result”,但是在“ result”之前显示“ myJson”。请帮助我。

async function show() {
  var con = mysql.createConnection({
    host: "127.0.0.1",
    user: "root",
    password: "aaaaaaaa",
    database: "doto"
  })
  var myJson = null;
  var sql = "select * from task_list";
  result = "[";
  con.connect(function (err) {
    if (err) throw err;
    con.query(sql, function (err, rows, fields) {
      if (err) throw err;
      rows.forEach((row) => {
        result = result + '{ detail:' + row.details + ", status:" + row.status + ", subject:" + row.subject + '},';
      });
      console.log("result" + result);
    });
  });
  result = await result.substring(0, result.length - 1);
  result = await result + ']';
  myJson = await JSON.stringify(result);
  await console.log("myJson" + myJson);
  return await myJson;
}

1 个答案:

答案 0 :(得分:0)

这个问题的简单答案是,您使用await是完全错误的... await用于异步请求。即:调用IO或FS。您很可能应该查看有关用法的MDN文档,但是可以帮助您解决此问题的方法是将conn.connect()方法下面的代码添加到con.query()回调中。这将是最简单的解决方案。您可以完成此操作的另一种方法是将conn.connect()包装在promise中,然后在conn.query()回调中解析结果。示例如下:

回调:

const conn = mysql.connect()
conn.connect((err, connection) => {
    connection.query("query", (err, results) => {
        // do all stuff with results here
    })
})

承诺:

await new Promise((resolve, reject) => {
    conn.connect((err, connection) => {
        if (err) return reject(err)
        connection.query("query", (err, results) => {
             if (err) return reject(err)
             resolve(results)
        })
    })
})

类似的事情会起作用