koa下mysql连接池案例

下面是一个简单的示例,演示了如何在Koa应用程序中使用MySQL连接池:

const Koa = require('koa');
const Router = require('koa-router');
const mysql = require('mysql');

const app = new Koa();
const router = new Router();

// 创建MySQL连接池
const pool = mysql.createPool({
  host: 'localhost',
  user: 'your_username',
  password: 'your_password',
  database: 'your_database'
});

// 使用连接池执行查询的中间件
app.use(async (ctx, next) => {
  ctx.db = await getConnectionFromPool();
  await next();
  ctx.db.release(); // 释放连接回连接池
});

// 路由示例
router.get('/users', async (ctx) => {
  const [rows] = await ctx.db.query('SELECT * FROM users');
  ctx.body = rows;
});

// 将路由挂载到应用程序
app.use(router.routes()).use(router.allowedMethods());

// 启动应用程序
const port = 3000;
app.listen(port, () => {
  console.log(`Server running on port ${port}`);
});

// 从连接池中获取连接的辅助函数
function getConnectionFromPool() {
  return new Promise((resolve, reject) => {
    pool.getConnection((error, connection) => {
      if (error) {
        reject(error);
        return;
      }
      resolve(connection);
    });
  });
}

在这个示例中,我们在Koa应用程序中使用了一个中间件来处理数据库连接。在每个请求中,我们从连接池中获取一个连接,并将其附加到 ctx.db 上,以便在路由中使用。在中间件的最后,我们使用 ctx.db.release() 来释放连接,将其返回到连接池中。

通过使用连接池,您不必手动管理连接的打开和关闭,MySQL客户端库将会在需要时自动进行管理,这样您的代码更简洁,更易于维护。

 

上面有一段代码是错的,query返回的是一个对象,里面没有数据库的返回数据。

// 路由示例
router.get('/users', async (ctx) => {
  const [rows] = await ctx.db.query('SELECT * FROM users');
  ctx.body = rows;
});

//改成
db.query("SELECT * FROM users", (err, result) => {
	if (err) {
		console.error("Error:" + err);
		return;
	}
	console.log("result:", result);
});

ctx.body不能写到数据库查询成功的块里面,因为数据库查询也是异步的,这个路由已经执行完了,ctx.body就不起作用了。所以得改成下面这样的。

router.get('/data', async (ctx, next) => {
  // 使用 await 等待查询结果
  try {
    const results = await new Promise((resolve, reject) => {
      connection.query('SELECT * FROM your_table', (error, results, fields) => {
        if (error) reject(error);
        resolve(results);
      });
    });
    ctx.body = results; // 将查询结果作为响应主体发送到客户端
  } catch (error) {
    ctx.status = 500;
    ctx.body = { error: 'Internal Server Error' };
  }
});

解决方案:

https://blog.csdn.net/qq_39045645/article/details/101537424

posted @   C羽言  阅读(27)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示