最近在做团队的一个内部系统,这次使用的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. fiddler 配置

    fiddler 是一个抓包工具: 配置模拟器:(逍遥游安卓模拟器) 逍遥参考:http://www.xyaz.cn/thread-163-1-1.html 1.启动模拟器后,点击设置,点击进入Wi-F ...

  2. 介绍开源的.net通信框架NetworkComms框架 源码分析(二十二 )TCPConnectionStatic

    原文网址: http://www.cnblogs.com/csdev Networkcomms 是一款C# 语言编写的TCP/UDP通信框架  作者是英国人  以前是收费的 目前作者已经开源  许可是 ...

  3. python Day01

    Python Day01 Python 简介 介绍 Python 是一种面向对象.直译式的计算机程序设计语言,也是一种功能强大的通用型语言,已经有将近二十年的发展历史,成熟稳定.包含了一组完善而且容易 ...

  4. C# 开源压缩组件比较

    SevenZipSharp check()为检查压缩包,有BUG,360创建的zip压缩包有无密码,密码错对都返回true DotNetZip 提供的函数比较人性化,缺点是只支持zip SharpCo ...

  5. Nginx的启动、停止与重启

      启动 启动代码格式:nginx安装目录地址 -c nginx配置文件地址 例如: [root@LinuxServer sbin]# /usr/local/nginx/sbin/nginx -c / ...

  6. JAVA 之print,printf,println

    print:将它的参数显示在命令窗口,并将输出光标定位在所显示的最后一个字符之后. println: 将它的参数显示在命令窗口,并在结尾加上换行符,将输出光标定位在下一行的开始. printf:是格式 ...

  7. 第一章 删掉centos原有的openjdk并安装sun jdk

    一.卸载原有openjdk rpm -qa | grep java 之后,将展示出来的全部卸载掉,我这里是5个 rpm -e --nodeps java-1.7.0-openjdk-1.7.0.111 ...

  8. Struts2 验证框架 validation.xml 常用的验证规则

    validation.xml 的命名规则和放置路径: 文件名:<ActionClassName>-validation.xml <ActionClassName>就是要验证的A ...

  9. easy ui 框架

    Easy UI 准备工作(搭建) 1.在WebRoot 的目录下创建js 文件夹,在文件夹中倒入一下两个包 Jquery.easyui.min.js jquery.min.js 2.在WebRoot ...

  10. maven建立本地仓库

    maven 建立本地仓库 博客分类: java,maven,nexus   前面我讲到为什么要使用 Maven, Maven 的安装,以及 如何与 IDE 集成等,前面的介绍可以认为是一个 Hello ...