最近學習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 框架。
教程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 = `
<div>
<h1>Hello,Koa2! request POST</h1>
<h2>註冊頁!!!</h2>
<form method="POST" action="/user/register">
<p>username:</p>
<input name="username" /> <br/>
<p>password:</p>
<input name="password" /> <br/>
<button type="submit">submit</button>
</form>
</div>
`;
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 = `
<div>
<h1>Hello,Koa2! request POST</h1>
<h2>頁!!!</h2>
<form method="POST" action="/user/login">
<p>username:</p>
<input name="username" /> <br/>
<p>password:</p>
<input name="password" /> <br/>
<button type="submit">submit</button>
</form>
</div>
`;
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 = '<h1>Hello Bruce1G</h1>'
});
app.listen(3000, () => {
console.log('*********[Service] starting at port 3000 ***********');
})
嘗試運行一下吧!!