最近在做團隊的一個內部系統,這次使用的nodejs web框架是團隊統一的hapi.js,而數據庫依然是mysql,ORM 框架選用有着6000+ stars 的 sequelize.js,hapi-sequelize
插件對sequelize做了很簡單的封裝,可以讓我們很自如地在hapi中游走,比如配置和調用。
初始化 sequelize
// server.js
const Hapi = require('hapi');
const server = new Hapi.Server();
//注冊到 hapi server
server.register(
[
{
register: require('hapi-sequelize'),
options: {
database: '',
user: '',
pass: '',
dialect: 'mysql',
port: 3306,
models: 'Models/**/*.js',
sequelize: {
define: {
underscoredAll: true
}
}
}
},
], (err) => {
if (err) {
console.error('failed to load plugin');
}
}
);
定義數據模型
// Models/user.js
function userModel(sequelize, DataTypes) {
var User = sequelize.define('User', {
user_name: { //定義User表中的每一個字段
type: DataTypes.STRING, //字段數據類型
allowNull: false //是否允許為空
},
user_level: {
type: DataTypes.INTEGER,
allowNull: false
},
user_proj: {
type: DataTypes.STRING
}
});
return User;
}
module.exports = userModel;
同步模型到數據庫
// server.js
server.plugins['hapi-sequelize']
.db.sequelize.sync().then(function () {
console.log('models synced');
});
//sync方法如果配置{force: true}時,如果數據庫是否有該表,如果有則會刪除表,再重建。
使用模型
經過配置后,我們可以在路由handler
中使用這個實例:
// Route/index.js
function index(req, res) {
var models = req.server.plugins['hapi-sequelize'].db.sequelize.models;
models.User.find({...}).then({...});
}
module.exports = {
method: 'GET',
path: '/',
handler: index
}];
新增一條記錄
models.User.create({
user_name: 'John',
user_level: 9
}).then((data) => {
//...
});
查詢記錄
var user = models.User.findOne({
//...
}).then((data) => {
//...
});
這是一個異步過程,sequelize 內部使用了 bluebird 對異步流程控制。變量user得到的是 Promise 對象,並非查詢結果。
刪除記錄
models.User.destroy({
where: {
id: 1
}
}).then(function(rowDeleted) {
if(rowDeleted === 0){
console.log('成功刪除記錄');
}
}, function(err){
console.log(err);
});
//軟刪除操作:
// models.User.destroy({where: {id: userId}}, {force: false});
// 恢復軟刪除,使用 restore 方法 http://sequelize.readthedocs.org/en/latest/api/instance
多表查詢
要實現用戶權限管理的RBAC模型,那需使用到多表查詢,其實就是數據庫中的association:
//1:1
// user model
var user = sequelize.define('User', {/*attribute*/});
User.hasOne(userInfo);
// userInfo model
var userInfo = sequelize.define('userInfo', {/*attribute*/});
userInfo.belongsTo(User);
// 查
var userInfo = yield user.getUserInfo();
自定義SQL
當業務較復雜時,sequelize 有可能無法滿足你的需求,你可以編寫自己的SQL語句:
var sequelize = req.server.plugins['hapi-sequelize'].db.sequelize;
sequelize.query('SELECT * ...');