在 Express 使用 Modelar ORM
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 模型,你也可以自己创建一个新的模型,然后运行它以试试效果。