最近学习koa2 + MySQL时看到 ‘Sequelize’关键词说是管理数据库的,就去google了一下,发现是一个好东西,打开了新的世界!!
源码先上为敬
Sequelize 是一款比较主流的基于Node异步ORM框架(Object-Relational-Mapping 对象关系映射),具体定义自定搜一下。
大致就是在 Node 开发中,避免在代码中直接操作 SQL 语句,并且可以像操作实体对象的属性和方法一样去操作数据库。
ORM 技术是在对象和数据库之间提供了一条桥梁,前台的对象型数据和数据库中的关系型的数据通过这个桥梁来相互转化。
不同的编程语言,有不同的ORM框架:
例如Java,它的ORM框架就有:Hibernate,Ibatis/Mybatis等等(Hibernate和Mybatis使用过,不过已经忘光了,哈哈哈哈。在学校里学的数据库知识都还给老师了-。-!!!)。
在Node Web开发中,Sequelize 就是一款比较流行的 ORM 框架。
附上廖大大的教程
Sequelize中文教程
Sequelize英文教程
教程1
npm 下安装(版本注意哦,现在的是5.x版本,以前版本的一些API有改动(findById => findByPK等));
npm install sequelize
我的package.json,基本常用,对了,我这边是使用的MySQL,自行安装哦 MySQL教程 ,那个mysq2是比mysql更人性化点,具体我没对比过,可以自行查阅。
"dependencies": {
"koa": "^2.8.1",
"koa-bodyparser": "^4.2.1",//对传入的请求体进行解析
"koa-router": "^7.4.0",
"koa2-cors": "^2.0.6",//cors跨域
"mysql2": "^1.7.0",
"sequelize": "^3.24.1"
}
尝试搭建了一个小项目,默认都安装成功了哦!
目录如下:
1、配置数据库信息,提前先开启MySQL服务哦!!!
const config = {
host: 'localhost', //主机名
database: 'lg', //使用的哪个数据库名
username: 'root',//账号
password: '123456',//密码
port: 3306, //端口号,mysql默认3306
}
module.exports = config;
2、Sequelize连接数据库,初始化sequelize实例
const Sequelize = require("sequelize");
const config = require("./config");
console.log('init sequelize...');
const sequelize = new Sequelize(config.database, config.username, config.password, {
host: config.host, //数据库地址
dialect: 'mysql', //指定连接的数据库类型
pool: {
max: 5, //连接池最大连接数量
min: 0, //最小连接数量
idle: 10000, //如果一个线程 10秒内么有被使用过的话,就释放
},
logging: true, // 执行过程会log一些SQL的logging,设为false不显示
})
//对连接进行测试,查看控制台
/* sequelize
.authenticate()
.then(() => {
console.log('******Connection has been established successfully.********');
console.log('******测试结束,即将退出!!!********');
process.exit(); //结束进程
})
.catch(err => {
console.error('***************Unable to connect to the database:***********', err);
}); */
module.exports = sequelize;
3、创建User实例模型
const Sequelize = require("sequelize");
const sequelize = require('../database/db');
const User = sequelize.define('users', {
username: {
type: Sequelize.STRING(100),
unique: true
},
password: Sequelize.STRING(100),
},
{
freezeTableName: false,
timestamps: true
});
//timestamp字段,默认为true,表示数据库中是否会自动更新createdAt和updatedAt字段,false表示不会增加这个字段。
//freezeTableName,默认为true,会自动给表名表示为复数: user => users,为false则表示,使用我设置的表名
//创建表,默认是false,true则是删除原有表,再创建
User.sync({
force: false,
});
module.exports = User;
4、创建model.js扫描所有的实例模型,方便之后的按需引入
/* 扫描所有的model模型 */
const fs = require("fs");
let files = fs.readdirSync(__dirname + '/models'); //同步遍历目录
let js_files = files.filter((f) => {
return f.endsWith('.js');
}, files);
module.exports = {};
for (let f of js_files) {
console.log(`import model from file ${f}...`);
let name = f.substring(0, f.length - 3); //User.js ==> name : User
module.exports[name] = require(__dirname + "/models/" + f);
}
5、UserAPI.js 写接口,model的API可以去翻看官网的文档,常用的有:create(增)、destroy(删)、save(改)、findOne/findAll(查)
const model = require("../model");
const Router = require("koa-router");
let router = new Router();
let User = model.User; //获取User模型
router.get('/', async (ctx) => {
ctx.body = '欢迎来到用户首页!'
});
//注册页
router.get('/registerPage', async (ctx) => {
let html = `
Hello,Koa2! request POST
注册页!!!
`;
ctx.body = html;
});
//注册
router.post('/register', async (ctx) => {
let registerUser = ctx.request.body;
await User.create({
username: registerUser.username,
password: registerUser.password
})
.then((result) => {
ctx.body = {
code: 200,
msg: '注册成功!',
message: result
}
})
.catch(err => {
ctx.body = {
code: 500,
msg: '注册失败!',
message: err
}
})
});
//登录页
router.get('/loginPage', async (ctx) => {
let html = `
Hello,Koa2! request POST
页!!!
`;
ctx.body = html;
});
//登录
router.post('/login', async (ctx) => {
let loginUser = ctx.request.body;
//数据库查询
await User.findOne({
where: {
username: loginUser.username,
}
})
//查询值传入
.then(async (result) => {
//判断密码是否一致
if (result && (result.password === loginUser.password)) {
ctx.body = {
code: 200,
message: '登录成功',
};
} else {
ctx.body = {
code: 500,
message: '用户名不存在',
};
}
})
.catch(err => {
//findOne行为发生错误时
ctx.body = {
code: 500,
message: '登录出错!',
data: err
};
})
});
//查找所有
router.get('/allUser', async (ctx) => {
try {
let result = await User.findAll();
if (result) {
ctx.body = {
code: 200,
message: result
}
} else {
ctx.body = {
code: 500,
message: '表中没有数据!',
};
}
} catch (error) {
ctx.body = {
code: 500,
message: '错误',
data: err
};
}
})
module.exports = router;
6、index.js,把需要用到的引入引入,然后创建服务
const Koa = require("koa");
const app = new Koa();
const Router = require("koa-router");
const bodyParser = require("koa-bodyparser"); //对传入的请求体进行解析
// const cors = require("koa2-cors");//跨域
app.use(bodyParser());
//引入路由
let user = require("./API/UserAPI.js");
//装载所有子路由
let router = new Router();
router.use('/user', user.routes());
//加载路由中间件
app.use(router.routes());
app.use(router.allowedMethods());
app.use(async (ctx) => {
ctx.body = 'Hello Bruce1G
'
});
app.listen(3000, () => {
console.log('*********[Service] starting at port 3000 ***********');
})
尝试运行一下吧!!