最近在做团队的一个内部系统,这次使用的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 * ...');