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 ...
随机推荐
- JavaScript入门⑥-WEB浏览器API
JavaScript入门系列目录 JavaScript入门①-基础知识筑基 JavaScript入门②-函数(1)基础{浅出} JavaScript入门③-函数(2)原理{深入}执行上下文 JavaS ...
- .NET 6 中外部引用项目NU1105异常问题解决
.NET 6 Project中,添加了其他解决方案的工程后,本地能编译通过,代码签入后,其他同事下载代码,编译报错: 错误 NU1105 找不到"E:\Teld\01Code\TTP_CTP ...
- Dijkstra 算法说明与实现
Dijkstra 算法说明与实现 作者:Grey 原文地址: 博客园:Dijkstra 算法说明与实现 CSDN:Dijkstra 算法说明与实现 问题描述 问题:给定出发点,出发点到所有点的距离之和 ...
- python什么是异常?如何处理异常
异常处理 什么是异常 异常是程序错误发生的信号.程序一旦出现错误,就会产生一个异常,如果程序中没有处理该异常,该异常就会抛出来,程序的运行也随即终止. 错误分为两种 1.语法错误 2.逻辑错误 如何处 ...
- pyqt5制作俄罗斯方块小游戏-----源码解析
一.前言 最近学习pyqt5中文教程时,最后一个例子制作了一个俄罗斯方块小游戏,由于解释的不是很清楚,所以源码有点看不懂,查找网上资料后,大概弄懂了源码的原理. 二.绘制主窗口 将主窗口居中,且设置了 ...
- [数据与分析可视化] D3入门教程1-d3基础知识
d3.js入门教程1-d3基础知识 文章目录 d3.js入门教程1-d3基础知识 1 HTML介绍 1.1 什么是HTML? 1.2 自定义文档样式CSS 1.3 构建svg图形 2 d3绘图入门 2 ...
- bbs项目(部分讲解)
文章评论业务完善 提交评论 评论框里面的内容会清空 然后页面会有一个临时评论样式出现 页面刷新才会出现评论楼样式 研究子评论特性 每个评论右侧都应该有回复按钮 点击就可以填写子评论 点击回复按钮具体动 ...
- Windows安装Anaconda并且配置国内镜像教程
前言 我们在学习 Python 的时候需要不同的 Python 版本,关系到电脑环境变量配置换来换去很是麻烦,所以这个时候我们需要一个虚拟的 Python 环境变量,我之前也装过 virtualenv ...
- strapi系列-如何创建一个定时任务-Cron Jobs
Cron 是什么? Cron 有多种用途. Cron Jobs 用于安排服务器上的任务运行.它们最常用于自动化系统管理或维护.然而,它们也与 Web 应用程序的构建相关. Web 应用程序可能需要在各 ...
- 论文翻译:2022_2022_TEA-PSE 2.0:Sub-Band Network For Real-Time Personalized Speech Enhancement
论文地址:TEA-PSE 2.0:用于实时个性化语音增强的子带网络 论文代码: 引用: 摘要 个性化语音增强(Personalized speech enhancement,PSE)利用额外的线索,如 ...