Javascript Node.JS上mySql的异步调用
因此,我试图在node.js项目中异步创建getConnection和查询,因为我只想在查询之后呈现响应。这是代码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
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如果只有一个页面使用连接,这其实并不重要。使用此设置,在应用程序的生命周期内只创建了一个连接/池(因此不是每个请求都创建一个新的连接/池)。