在 Express 使用 Modelar ORM
发布于 7 年前 作者 Hyurl 3502 次浏览 来自 分享

Node.js 是一个单线程软件,当进行多客户端的服务器编程时,你无法确定什么时候、在哪里, 一个静态对象的状态处在了合适的位置,因此你必须创建一个拥有自己的状态的实例。

我说这个的意思是,服务器上的每一个数据库连接必须是独立于每一个请求的,即使它们可以 在不同请求之间共享,但那也必须等到一个请求完成了它的工作。

这这种情况下,你必须为每一个请求都创建一个新的 DB 实例并建立连接,然后在这个特有的 请求过程中传递它。同时,DB 类提供了一个内部的数据库连接池,当当前连接完成了它的工作 之后,它可以被回收并等待下一个请求重新取回它。

const express = require("express"); // npm install express
const bodyParser = require('body-parser'); // npm install body-parser
const { DB, User } = require("modelar"); // npm install modelar
const app = express();

// 开启服务器,监听 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.json());
app.use(bodyParser.urlencoded({ extended: true }));

// 定义一个 Express 中间件来保存数据库连接。
app.use((req, res, next) => {
    // 创建数据库连接,将它保存在 req.db 属性中。
    req.db = new DB({
        type: "mysql",
        database: "modelar",
        host: "127.0.0.1",
        port: 3306,
        user: "root",
        password: "161301"
    });

    // 添加一个事件处理器,当响应被发送回客户端后,回收数据库连接并等待下一个请求
    // 取回它。
    res.on("finish", () => {
        req.db.release();
    });

    next();
});

// 定义一个路由来创建用户数据表
app.post("/user/create-table", async (req, res) => {
    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(req.db).save();
        res.json({
            success: true,
            data: "数据表创建成功!",
        });
    } catch (e) {
        res.json({
            success: false,
            msg: e.message,
        });
    }
});

// 定义一个路由来创建一个新用户
app.post("/user/create", async (req, res) => {
    try {
        // 创建一个新用户
        var user = new User;
        user.name = req.body.username || "Luna";
        user.email = req.body.email || "luna@hyurl.com";
        user.password = req.body.password || "123456";

        // 保存用户并向客户端返回消息
        user = await user.use(req.db).save();
        res.json({
            success: true,
            data: user,
        });
    } catch (e) {
        res.json({
            success: false,
            msg: e.message,
        });
    }
})

// 定义一个路由用来通过 UID 获取一个用户。
app.get("/user/:id", async (req, res) => {
    try {
        // 获取用户
        var user = await User.use(req.db).get(req.params.id);
        res.json({
            success: true,
            data: user,
        });
    } catch (e) {
        res.json({
            success: false,
            msg: e.message,
        });
    }
});

这个示例中使用了内置的 User 模型,你也可以自己创建一个新的模型,然后运行它以试试效果。

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

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

2 回复

每个都 try catch 不优雅,可以在后面跟一个 app.use(全局错误处理) 统一返回

@zhuweiyou 这就一个示例,你还要多优雅?不过你的提法很好,真正项目应该这么用。

回到顶部