Sequelize.js + Express.js 开发 API
什么是 Sequelize
我们知道 Web 应用开发中的 Web 后端开发一般都是 Java、Python、ASP.NET 等语言。十年前,Node.js 的出现使得原本仅限于运行在浏览器中的 JavaScript 也有了可以开发 Web 后端的机会了。
就对于 MySQL 来说,已经有了偏向于底层的框架 mysql npm 包,但现在要说的是一个基于 Promise 的 Node.js ORM 工具 —— Sequelize.js。结合 Express 来响应 HTTP 请求,定义路由表用于执行不同的 HTTP 请求动作,前端工程师可以基于 Node.js 开发一套服务器。
Sequelize.js 目前支持 Postgres、MySQL、MariaDB、SQLite 以及 Microsoft SQL Server。它具有强大的事务支持、关联关系、预读和延迟加载、读取复制等功能。
ORM 是对象关系映射(Object Relational Mapping)的简称,是一种程序设计技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。其实是创建了一个可在编程语言里使用的“虚拟对象数据库”。
原生 API 的问题
如果 users 和 comments 是一对多的关系。在不使用 Sequelize 框架操作数据库时,对于关联查询,是这样操作的:
let sql = "select u.*, c.u_id, c.content from users as u inner join comments as c on u.id = c.u_id"
connection.query(sql, (err, result, fields) => {
res.send(result)
})
查询每一个用户发表的评论,所以查询的结果为:
点击查看代码
[
{
"id": 1,
"name": "Jane",
"userId": 1,
"content": "内容111"
},
{
"id": 1,
"name": "Jane",
"userId": 1,
"content": "内容222"
},
{
"id": 1,
"name": "Jane",
"userId": 1,
"content": "内容333"
}
]
查询结果显示,只有 content
字段的内容不一致,但结构是重复,我们希望得到的结果是这样的:
[
{
"id": 1,
"name": "Jane",
"userId": 1,
"content": ["内容111", "内容222", "内容333"]
}
]
现在,是时候使用 Sequelize 来连接数据库进行操作了。
基于 Sequelize 开发接口
安装依赖
你需要保证你的项目需要有 mysql2、sequelize、express 三个依赖包,你可以选择一个干净的项目来进行实战。
npm install mysql2 express
连接数据库
导入 express、sequelize
const express = require('express')
const { Sequelize, DataTypes } = require('sequelize')
实例化 sequelize
Sequelize 类有四个构造函数,分别如下:
constructor(database: string, username: string, password?: string, options?: Options);
constructor(database: string, username: string, options?: Options);
constructor(options?: Options);
constructor(uri: string, options?: Options);
Options 定义的是一个 TS 接口,这个接口有更多的数据库配置信息,具体还有什么内容,查看源码。在这里,我选择使用第三个构造函数对数据库进行配置。
const sequelize = new Sequelize({
database: 'test',
username: 'shiramashiro',
password: '123456',
host: 'localhost',
port: 3306,
dialect: 'mysql' // 该字段指定要连接的数据库
})
创建数据表
定义模型
模型是 Sequelize 用于描述 JS 对象与数据库表的映射关系。
const User = sequelize.define('user', {
username: DataTypes.TEXT,
password: {
type: DataTypes.STRING(11),
defaultValue: '123456'
}
})
const Comment = sequelize.define('comment', {
content: DataTypes.TEXT
})
关联模型
在使用关联查询之前,需要让 Sequelize 知道数据库表之间的关系,是一对一,还是一对多,还是多对多。
Sequelize 提供了四种关联方法:HasOne 、BelongsTo 关联类型、HasMany 关联类型、BelongsToMany 关联类型。
根据当前文章案例,我需要使用 HasMay 关联类型和 BelongsTo 关联类型。
/**
* 关联模型,一对多,User 与 Comment 是一对多的关系。
*/
User.hasMany(Comment)
Comment.belongsTo(User)
添加数据
Sequelize 为我们提供了批量添加数据的方法,即 bulkCreate
方法。
点击查看代码
User.bulkCreate([
{
username: 'shiramashiro',
password: '654321'
},
{
username: 'javascript',
password: 'js123456'
}
])
Comment.bulkCreate([
{
content: '内容111',
userId: 1
},
{
content: '内容222',
userId: 1
},
{
content: '内容333',
userId: 1
},
{
content: '内容444',
userId: 2
},
{
content: '内容555',
userId: 2
}
])
关联查询
定义好模型和模型之间的关系之后,我们就可以开始进行关联查询了。
User.findAll({ include: Comment })
.then((result) => {
res.send(result)
})
.catch((error) => {
console.log(error)
})
最后呈现的数据如下:
点击查看代码
[
{
"id": 1,
"username": "shiramashiro",
"password": "654321",
"createdAt": "2021-11-05T10:43:29.000Z",
"updatedAt": "2021-11-05T10:43:29.000Z",
"comments": [
{
"id": 3,
"content": "内容333",
"createdAt": "2021-11-05T10:43:29.000Z",
"updatedAt": "2021-11-05T10:43:29.000Z",
"userId": 1
},
{
"id": 2,
"content": "内容222",
"createdAt": "2021-11-05T10:43:29.000Z",
"updatedAt": "2021-11-05T10:43:29.000Z",
"userId": 1
},
{
"id": 1,
"content": "内容111",
"createdAt": "2021-11-05T10:43:29.000Z",
"updatedAt": "2021-11-05T10:43:29.000Z",
"userId": 1
}
]
},
{
"id": 2,
"username": "javascript",
"password": "js123456",
"createdAt": "2021-11-05T10:43:29.000Z",
"updatedAt": "2021-11-05T10:43:29.000Z",
"comments": [
{
"id": 5,
"content": "内容555",
"createdAt": "2021-11-05T10:43:29.000Z",
"updatedAt": "2021-11-05T10:43:29.000Z",
"userId": 2
},
{
"id": 4,
"content": "内容444",
"createdAt": "2021-11-05T10:43:29.000Z",
"updatedAt": "2021-11-05T10:43:29.000Z",
"userId": 2
}
]
}
]
结合 Express 开发接口
对于上面的查询方法,我们可以设计一个 HTTP API 接口,供前端项目使用。
const express = require('express')
const app = express()
app.get('/', (req, res) => {
User.findAll({ include: Comment })
.then((result) => {
res.send(result)
})
.catch((error) => {
console.log(error)
})
})
app.listen(3000, () => { console.log('server was running at 3000...') })
总结
在编程中,把面向对象的概念跟数据库中表的概念对应起来。ORM 的好处就是不用操作表,可以在程序中用面向对象的思路,直接操作对象即可。Sequelize 基于这样的程序设计技术,为我们提供了大量的可操作数据库的方法。比如 bulkCreate
批量插入数据,我们只需要直接调用方法即可,Sequelize 会自动为我们生成 SQL 语句。
Sequelize.js + Express.js 开发 API的更多相关文章
- Node.js + Express + Knex 开发 API 接口
安装依赖包 npm i express knex mysql2 这是 Knex 官方文档地址:Knex.js - SQL query builder. 搭建接口 config.js 新建一个 conf ...
- socket.io+angular.js+express.js做个聊天应用(三)
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/www19940501a/article/details/27590611 接着前面博客文章socke ...
- Angular JS + Express JS入门搭建网站
3月份开始,接到了新的任务,跟UI开发有关,用的是Angular JS,Express JS等技术.于是周末顺便学习下新技术. 组里产品UI架构如下: 其中前端,主要使用Angular JS框架,另外 ...
- soket.io.js + angular.js + express.js(node.js)
soket.io.js + angular.js + express.js(node.js) 今天搭建个soket.io.js + angular.js + express.js的环境, 采坑无数,特 ...
- 基于 Sequelize.js + Express.js 开发一套 Web 后端服务器
什么是 Sequelize 我们知道 Web 应用开发中的 Web 后端开发一般都是 Java.Python.ASP.NET 等语言.十年前,Node.js 的出现使得原本仅限于运行在浏览器中的 Ja ...
- Node.js + Express + Mongodb 开发搭建个人网站(二)
二.路由 1.打开 routes/index.js ,这个意思就是 捕获到访问主页的get请求: 并通过 app.js 分配到对应的路由里: 看到这里,打开 http://127.0.0.1:300 ...
- 【nodejs笔记1】配置webstorm + node.js +express + mongodb开发博客的环境
1. 安装webstorm 并破解 2. 安装node (以及express框架) 至官网下载并安装.(http://nodejs.org)v0.10.32 msi 安装后测试,打开命令行, c ...
- Node.js + Express + Mongodb 开发搭建个人网站(三)
三.后台架构 1.在根目录下(和 views 文件夹同级)创建 lib 文件夹 以后所有后端内容 都是在这里写,分别创建三个文件夹 到 lib 目录下: mongo 放的是数据的存储 module ...
- Node.js + Express + Mongodb 开发搭建个人网站(一)
一.Node + Express环境搭建 0.去Node官网下载安装node,如果安装了 npm 和 node的话 那么就 安装 全局的 express,-g全局安装 npm install expr ...
- socket.io+angular.js+express.js做个聊天应用(一)
node,express开发环境等安装如果已经搞好了. justhacker@justhacker-ThinkPad-Edge-E440:~/projects/nodejs$ express -e c ...
随机推荐
- 3D旋转不能对齐,元素边倾斜
1 <!DOCTYPE html> 2 <html lang="en"> 3 4 <head> 5 <meta charset=" ...
- MyBatis详解(二)
前言 本篇幅是继 MyBatis详解(一)的下半部分. MyBatis执行Sql的流程分析 [1]基于前面已经将XML文件进行build解析了并且返回了SqlSessionFactory [1.1]那 ...
- loadrunner11安装时提示缺少Microsoft Visual c++2005 sp1组件的解决办法
解决方法: 1.进入loadrunner-11安装程序\loadrunner-11\Additional Components\IDE Add-Ins\MS Visual Studio .NET文件夹 ...
- 【RocketMQ】主从模式下的消费进度管理
在[RocketMQ]消息的拉取一文中可知,消费者在启动的时候,会创建消息拉取API对象PullAPIWrapper,调用pullKernelImpl方法向Broker发送拉取消息的请求,那么在主从模 ...
- 时间老去,Ruby不死,Ruby语言基础入门教程之Ruby3全平台开发环境搭建EP00
如果说电子游戏是第九艺术,那么,编程技术则配得上第十艺术的雅称.艺术发展的普遍规律就是要给与人们对于艺术作品的更高层感受,而Matz的Ruby语言则正是这样一件艺术品. 无论是语法还是理念,都让Rub ...
- prometheus-监控docker服务器
1. prometheus-监控docker服务器 prometheus-监控docker服务器 cAdvisor(Container Advisor):用于收集正在运行的容器资源使用和性能信息. 项 ...
- 大数据 - DWM层 业务实现
DWM 建表,需要看 DWS 需求. DWS 来自维度(访客.商品.地区.关键词),为了出最终的指标 ADS 需求指标 DWT 为什么实时数仓没有DWT,因为它是历史的聚集,累积结果,实时数仓中不需要 ...
- 有意思,小程序还可以一键生成App!
小程序≠微信小程序 说到小程序,大部分同学的第一反应,可能是微信小程序.支付宝小程序,确实,小程序的概念深入人心,并且已经被约定俗成的绑定到某些互联网公司的 APP 上. 但是,"小程序&q ...
- 《STL源码剖析》Sort排序分析
整体而言: sort算法在数据量大时采用Quick Sort(快速排序),一旦分段后的数据量小于某个门槛,为避免Quick Sort的递归调用带来过大的额外负担,就改用Insertion Sort(插 ...
- day03-Spring管理Bean-IOC-01
Spring管理Bean-IOC 1.Spring配置/管理bean介绍 Bean管理包括两方面: 创建bean对象 给bean注入属性 Bean的配置方式: 基于xml文件配置方式 基于注解配置方式 ...