在 Koa 使用 Modelar ORM
这篇文章介绍了如何在 Koa 中使用 Modelar ORM,并设置数据库连接自动回收。
const Koa = require("koa"); // npm install koa
const Router = require("koa-router"); // npm install koa-router
const bodyParser = require('koa-bodyparser'); // npm install koa-bodyparser
const { DB, Table, User } = require("modelar"); // npm install modelar
const app = new Koa();
const router = new Router();
// 开启服务器,监听 3000 端口。
var server = app.listen(3000, () => {
var host = "127.0.0.1";
var port = server.address().port;
console.log("Server started, please visit http://%s:%s", host, port);
});
app.use(bodyParser());
// 定义一个 koa 中间件来保存数据库连接。
app.use(async (ctx, next) => {
// 创建数据库连接,将它保存在 ctx.state.db 属性中。
ctx.state.db = new DB({
type: "mysql",
database: "modelar",
host: "127.0.0.1",
port: 3306,
user: "root",
password: "161301"
});
// 添加一个事件处理器,当响应被发送回客户端后,回收数据库连接并等待下一个请求
// 取回它。
ctx.res.on("finish", () => {
ctx.state.db.release();
});
await next();
});
// 定义一个路由来创建用户数据表
router.post("/user/create-table", async (ctx, next) => {
ctx.status = 200;
try {
// 创建一个名称为 users 的表
var table = new Table("users");
table.addColumn("id").primary().autoIncrement(10001);
table.addColumn("name", "varchar", 32).notNull();
table.addColumn("email", "varchar", 32).notNull();
table.addColumn("password", "varchar", 64).notNull();
// 保存表并向客户端返回消息
table = await table.use(ctx.state.db).save();
ctx.body = {
success: true,
data: "数据表创建成功!",
};
} catch (e) {
ctx.body = {
success: false,
msg: e.message,
};
}
await next();
});
// 定义一个路由来创建一个新用户
router.post("/user/create", async (ctx, next) => {
ctx.status = 200;
try {
// 创建一个新用户
var user = new User;
user.name = ctx.request.body.username || "Luna";
user.email = ctx.request.body.email || "[email protected]";
user.password = ctx.request.body.password || "123456";
// 保存用户并向客户端返回消息
user = await user.use(ctx.state.db).save();
ctx.body = {
success: true,
data: user,
};
} catch (e) {
ctx.body = {
success: false,
msg: e.message,
};
}
await next();
});
// 定义一个路由用来通过 UID 获取一个用户。
router.get("/user/:id", async (ctx, next) => {
ctx.status = 200;
try {
// 获取用户
var user = await User.use(ctx.state.db).get(ctx.params.id);
ctx.body = {
success: true,
data: user,
};
} catch (e) {
ctx.body = {
success: false,
msg: e.message,
};
}
await next();
});
app.use(router.routes());
这个示例中使用了内置的 User 模型,你也可以自己创建一个新的模型,然后运行它以试试效果。