在 Koa 使用 Modelar ORM
发布于 8 天前 作者 Hyurl 181 次浏览 来自 分享

这篇文章介绍了如何在 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 || "luna@hyurl.com";
        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 模型,你也可以自己创建一个新的模型,然后运行它以试试效果。

项目地址:https://github.com/hyurl/modelar

文档地址:http://modelar.hyurl.com

4 回复

ctx.state.db 这样做?。。。

@i5ting 这是 koa 的文档上写的,说用 ctx.state 来作为一个命名空间保存用户定义的属性

@Hyurl 不是这个意思,是你的db必须在第一次请求初始化。。。

@i5ting 这是在假设每一次请求都是用数据库连接的情况下,像我自己就不会这么用。我用 getter。还有,数据库连接不会在实例化时建立,只有真正用到时才会建立,release() 方法也只有在有连接时才会有效果

回到顶部