最近在做团队的一个内部系统,这次使用的nodejs web框架是团队统一的hapi.js,而数据库依然是mysql,ORM 框架选用有着6000+ stars 的 sequelize.jshapi-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 * ...');

参考资料

http://docs.sequelizejs.com/

Node.js ORM 框架 sequelize 实践的更多相关文章

  1. Node.js ORM框架Sequelize使用示例

    示例代码: const Sequelize = require('sequelize'); const sequelize = new Sequelize('database', 'username' ...

  2. Node.js ORM框架Sequlize之表间关系

    Sequelize模型之间存在关联关系,这些关系代表了数据库中对应表之间的主/外键关系.基于模型关系可以实现关联表之间的连接查询.更新.删除等操作.本文将通过一个示例,介绍模型的定义,创建模型关联关系 ...

  3. node.js & ORM & ODM

    node.js & ORM & ODM ODM & NoSQL Object Data Modeling 对象数据模型 Object Document Mapping 对象文档 ...

  4. Nodejs ORM框架Sequelize快速入门

    Nodejs ORM框架Sequelize快速入门 什么是ORM? 简单的讲就是对SQL查询语句的封装,让我们可以用OOP的方式操作数据库,优雅的生成安全.可维护的SQL代码.直观上,是一种Model ...

  5. Node.js Express 框架

    Node.js Express 框架 Express 简介 Express 是一个简洁而灵活的 node.js Web应用框架, 提供了一系列强大特性帮助你创建各种 Web 应用,和丰富的 HTTP ...

  6. 全端开发必备!10个最好的 Node.js MVC 框架

      Node.js 是最流行的 JavaScript 服务端平台,它允许建立可扩展的 Web 应用程序.Node.js 包含不同类型的框架,如 MVC 框架.全栈框架.REST API  以及大量的服 ...

  7. Koa – 更加强大的下一代 Node.js Web 框架

    Koa 是 Express 的开发团队设计的下一代 Web 框架,其目的是为 Web 应用程序提供更小,更具表现力,更坚实的基础.Koa 没有核捆绑任何中间件,并提供了一​​套优雅的方法,使服务器端开 ...

  8. 【360开源】thinkjs:基于Promise的Node.js MVC框架 (转)

    thinkjs是360奇舞团开源的一款Node.js MVC框架,该框架底层基于Promise来实现,很好的解决了Node.js里异步回调的问题.360奇舞团(奇虎75Team),是奇虎360公司We ...

  9. Node.js Express框架

    Express 介绍 Express是一个最小的,灵活的Node.js Web应用程序框架,它提供了一套强大的功能来开发Web和移动应用程序. 它有助于基于Node Web应用程序的快速开发.下面是一 ...

随机推荐

  1. 预测帖 苹果在2年之内会换Arm

    这几天看了iPad Pro和新的macbook, 我个人预测,苹果2年之内必换Arm处理器 首先会是笔记本. 而且会把软件移植也做的很好,不需要怎么改代码,只需要编译的时候加入相应的cpu就可以.至于 ...

  2. sql查询上一条记录和下一条记录

    上一条记录的SQL语句: * from news where newsid<id order by newsid DESC 下一条记录的SQL语句: * from news where news ...

  3. 今天研究一下SVN的分支和合并

    关键字: trunk, branch, tag, merge 以前一直以为很难,没敢接触.今天晚上看了一下,也不过如此 用起来还是很简单的

  4. (转)tar.xz文件如何解压

    XZ压缩最新压缩率之王 xz这个压缩可能很多都很陌生,不过您可知道xz是绝大数Linux默认就带的一个压缩工具. 之前xz使用一直很少,所以几乎没有什么提起. 我是在下载phpmyadmin的时候看到 ...

  5. 使用NPOI2.1.3.1版本导出word附带表格和图片

    原文:http://www.cnblogs.com/afutureBoss/p/4074397.html?utm_source=tuicool&utm_medium=referral 最近项目 ...

  6. hadoop-mongo map/reduce java

    官方 http://docs.mongodb.org/ecosystem/tutorial/getting-started-with-hadoop/ mongo-haoop项目地址 https://g ...

  7. PHP向mysql中插入数据的方法

    require "database.php"; $po_code = "YMWF2015-6-25-1"; $customer = "youmei&q ...

  8. 关于unity3D的学习感想

    在老师布置团队项目后组长确定项目是做游戏是,我才接触的Unity3D游戏引擎. 因为一开始我没有接触过这类软件,更没有用过.所以作为一个新手,做好的办 法实在网上找教程.网上说Unity3D是由Uni ...

  9. U盘启动盘 安装双系统 详细教程

    U盘启动盘 安装win7+linux双系统 最近在看鸟哥的linux 私房菜 ,看到多重系统那部分,自然的安装多重系统的激情由此而燃.在网上看了很多资料,感觉都不全.经过艰辛的摸索,终于被我发现了一个 ...

  10. Ajax提交与传统表单提交的区别说明

    Ajax提交是通过js来提交请求,请求与响应均由js引擎来处理,页面不会刷新,用户感觉不到实际上浏览器发出了请求.比如说我们希望网页总是显示最新的新闻,而又不想老是去点刷新按钮,我们就可以用Ajax机 ...