Javascript Node.JS上mySql的异步调用

Javascript Node.JS上mySql的异步调用,javascript,mysql,node.js,asynchronous,es6-promise,Javascript,Mysql,Node.js,Asynchronous,Es6 Promise,因此,我试图在node.js项目中异步创建getConnection和查询,因为我只想在查询之后呈现响应。这是代码 router.post('/', function(req, res, next) { var queryRows; con.getConnection(function(error, connection) { if(error) { } else { connection.query('SELECT * FROM Tablee', fun

因此,我试图在node.js项目中异步创建getConnection和查询,因为我只想在查询之后呈现响应。这是代码

router.post('/', function(req, res, next) {

  var queryRows;

  con.getConnection(function(error, connection) {
    if(error) {
    } else {
      connection.query('SELECT * FROM Tablee', function(error, rows, fields){
        queryRows = rows;
      });
    }
  });

  res.render('home', {data:queryRows});
}
我想先运行
getConnection()
和内部代码;然后渲染

我遵循了文中给出的精确解,但徒劳无功。 连接本身未定义;所以查询返回错误


我使用节点版本8来支持异步和等待;但是我无法得到结果。

mysql
不支持承诺,这是能够使用
async/await
的一个要求

<>而不是使用它或类似的东西包装它,您可以考虑将代码迁移到<代码> MySqL2,它支持框外承诺:

由于
mysql2
试图提供与
mysql
相同的API,因此代码更改应该是最小的

编辑:一些(未测试)示例代码:

// Install an Express middleware that will set up the database connection, if required.
// Call this somewhere "high up" in your Express app, before route declarations.
app.use(async (req, res, next) => {
  if (! app.db) {
    const mysql = require('mysql2/promise');
    app.db = await mysql.createConnection({ ... });
    // instead of .createConnection, you can also use .createPool
  }
  req.db = app.db;
  return next();
});
然后在你的路线上:

router.post('/', async function(req, res) {
  let [ queryRows, queryFields ] = await req.db.query('SELECT * FROM Tablee');
  res.render('home', { data : queryRows });
}

(为了简洁起见,我省略了所有错误处理,不过要确保添加了它)

您必须放置
res.render('home',{data:queryRows})
调用,然后回调
连接。查询
getConnection
connection.query
是异步的,因此在
res.render('home',{data:queryRows})时getConnection
connection中执行code>。尚未调用query
回调。或者如果使用api支持Promissions,则使用await和async。@t.niese是的,我可以将渲染放在查询中;但是我想使用wait和async运行整个代码;因为,与示例代码不同,我有其他渲染函数,只想在最后放置一个渲染。我想得到一个解决方案,我尝试了mysql2和promise包装器;但是我怎样才能准确地调用主函数呢?在@AbhijitS中,请参阅编辑以获取一些未经测试的示例代码,以创建(共享)数据库连接以及如何在路由中执行查询。是;这个很好用。但是我可以在router.post函数中创建池吗。因为在app.js中调用它只会产生不必要的db连接(因为我的页面中只有一个需要连接到db)。感谢您的解决方案。@AbhijitS如果只有一个页面使用连接,这其实并不重要。使用此设置,在应用程序的生命周期内只创建了一个连接/池(因此不是每个请求都创建一个新的连接/池)。