Node.js
什么是node.js
- 运行在 服务端的JavaScript
- 单线程 异步和事件驱动
node.js中的内置模块
- path模块 – (用于处理文件路径)
- path.normalize(路径解析,得到规范路径)
- path.join(路径合并)
- path.resolve(获取当前路径的绝对路径)
- path.relative(获取当前路径的相对路径)
- fs模块 – (文件操作系统的API)
- fs.readFile(filename, [options], callback) – (读取文件)
- fs.writeFile(filename, data, [options], callback) – (写文件)
- fs.mkdir(path, [mode](目录权限), callback) – (创建目录)
- fs.readdir(path, callback) – (读取目录)
- url模块 – (操作url)
- url.parse(urlString, boolean) – (将一个url的字符串解析并返回一个url对象)
- url.format(urlObj) – (将传入的url对象变成一个url字符串并返回)
- url.resolve(from, to) – (用于拼接url, 根据相对url拼接成新的url)
- http模块 – (服务端)
- http.createServer(fn) – (创建服务器)
- http.get(url, callback) – (发送get请求)
- http.request(options, callback) – (发送请求)
Node.js原生路由实现静态WebServer
- 创建服务 createServer
- 向请求的客户端发送响应头 response.writeHead(statusCode, headers)
‘Content-Type’: ‘text/html;charset=utf8’
- 向请求的客户端发送响应内容。在 response.end() 之前,response.write() 可以被执行多次
- 结束响应 response.end
告诉客户端所有消息已经发送。当所有要返回的内容发送完毕时,该函数必须被调用一次。
如何不调用该函数,客户端将永远处于等待状态。
- 监听 listen
什么是服务器 – (提供服务的机器)
性能更强, 计算能力更强的电脑
服务器可以用来做什么
- 部署服务
- 数据存储
前后端不分离架构
前后端不分离的好处
- 开发效率低
- 整个团队的协作耦合度高
- 团队容易甩锅
- 难以处理越来越复杂的业务
- 使得代码的耦合度更高
前后端分离
前后端分离的好处
- 提高开发效率
- 降低的软件设计的耦合度。不管是前端还是后端,都可以针对不同的端,实现一些工程化的东西。
- 提高了处理复杂业务的能力。后端可以只专注后端业务,前端可以专注于前端的业务
Express基础
Express介绍
- Express 是一个基于 Node.js 封装的上层服务框架,它提供了更简洁的 API 更实用的新功能。它通过中间件和路由让程序的组织管理变的更加容易;它提供了丰富的 HTTP 工具;它让动态视图的渲染变的更加容易;它还定义了一组可拓展标准。
Express创建服务器
- 导入 express 模块并新建变量。
- 创建 app 应用
- 设置访问 Root 路由,并将响应
- 设置程序监听的端口,并打赢服务启动成功的信息。
Generator生成器初始化项目
- npm install -g express-generator – 全局下载
- express --version 查看版本看是否安装成功
- 通过 express 项目名称来创建项目
- cnpm i 安装项目依赖
- npm start 运行项目
Express目录结构
- app.js – 入口文件
- package.json – 模块依赖等配置信息
- bin文件夹里面的www.js放一些全局配置项以及命令行配置等
- public 文件夹是用来存放项目静态文件目录如js,css以及图片
- routes文件夹是用来存放路由监听的代码相关文件
- views文件夹用来存放模板文件。
Express中间件与中间件栈
什么是中间件 用来处理(过滤)请求,最终为路由提供服务
应用级中间件
- app.use(url,function(req,res,next){});
- url 表示中间件要给哪一个路由的url使用,对应路由的url
- 在中间件中可以拦截到请求,也可以做出响应;
- next是一个函数,表示要执行下一个中间件或者路由
- 案例:登陆不通过 错误处理(404)
内置中间件
- express当前只有一个内置中间件。
- 把所有的静态资源托管到指定目录下,如果浏览器请求文件,自动到该目录下查找,不需要创建路由来响应文件。
路由中间件
- const router=express.Router();
- router.get – router.post – router.put router.delete
第三方中间件中间件
body-parser 解析body中的数据,并将其保存为Request对象的body属性
- const express=require(‘express’);
- const bodyParser=require(‘body-parser’);
- let app=express();
- app.use(bodyParser.urlencoded({extended:false}));
cookie-parser :解析客户端cookie中的数据,并将其保存为Request对象的cookie属性- const cookieParser=require(‘cookie-parser’);
- app.use(cookieParser());
模板引擎EJS
- app.set(“view engine”,“ejs”);//模版引擎设置为 ejs
Ejs使用规则
- <% %> 括起来的内容会作为 Javascript 代码来编译
- <%= %> 和 <%- %>将括起来的变量中的数据渲染到模板 * <%=…%>, 变量值若包含 ‘<’ ‘>’ ‘&’ 等字符会被转义 * <%-…%>, 变量值是什么就输出什么
- <%# 注释标记,不执行,不输出%>
- <%_ 删除其前面的空格符
MongoDB概念解析
MongoDB是一个基于分布式文件存储的数据库。由C++语言编写,旨在为WEB应用提供可扩展的高性能数据存储解决方案。MongoDB是一个介于关系型数据库和非关系型数据库之间的产品,是非关系型数据库当中功能最丰富,最像关系型数据库的。
关系型数据库与非关系型数据库的区别
关系型数据库
- 数据存储方式不同。关系型数据天然就是表格式的,因此存储在数据表的行和列中。数据表可以彼此关联协作存储,也很容易提取数据。
非关系型数据库
- 数据存储方式不同。非关系型数据不适合存储在数据表的行和列中,而是大块组合在一起。非关系型数据通常存储在数据集中,就像文档、键值对或者图结构。你的数据及其特性是选择数据存储和提取方式的首要影响因素。
MongoDB相比于关系型数据具备的优点
- 高可扩展性
- 分布式存储
- 低成本
- 结构灵活
命令行操作MongoDB
数据库常用命令
Collection 集合操作
- 创建一个聚集集合(table) db.createCollection(name, options);
- name: 要创建的集合名称
- options: 可选参数, 指定有关内存大小及索引的选项
字段 | 描述 |
---|---|
capped | 是否启用集合限制,如果开启需要制定一个限制条件,默认为不启用,这个参数没有实际意义 |
size | 限制集合使用空间的大小,默认为没有限制 |
max | 集合中最大条数限制,默认为没有限制 |
autoIndexId | 是否使用_id作为索引,默认为使用(true或false) |
size的优先级比max要搞
- 得到指定名称的集合 db.getCollection(name)
- 查看已有集合: show collections 或 show tables
- 得到当前db的所有聚集集合: db.getCollectionNames()
- 删除集合 db.[collection].drop()
Document 文档操作
- 插入文档: db.COLLECTION_NAME.insert(document)
- 获得当前DB的所有文档 db.COLLECTION_NAME.find().pretty() – pretty 易读的方式来读取数据
- 更新文档
- db.collection.update(查询条件,要更新的内容, { multi: true(是否全部更新) })
- db.collection.save(文档数据) 方法通过传入的文档来替换已有文档,_id 主键存在就更新,不存在就插入
- 删除文档 db.collection.remove(query, justOne, writeConcern) 如果参数传递一个空对象则全部删除
query :(可选)删除的文档的条件。
justOne : (可选)如果设为 true 或 1,则只删除一个文档,如果不设置该参数,或使用默认值 false,则删除所有匹配条件的文档。
writeConcern :(可选)抛出异常的级别。
- 简单查询文档
- findOne(): 它只返回一个文档。
- and 多个条件查询 db.col.find({key1:value1, key2:value2}).pretty()
- or 或者条件查询 db.col.find({$or:[{“by”:“条件1”},{“title”: “条件2”}]}).pretty()
集合查询
- 条件操作符
操作 | 格式 | 范例 |
---|---|---|
等于 | { key:value} | db.col.find({“by”:“内容”}) |
小于 | { key:{$lt:value}} | db.col.find({“likes”:{$lt:50}}).pretty() |
小于或等于 | { key:{$lte:value}} | db.col.find({“likes”:{$lte:50}}).pretty() |
大于 | { key:{$gt:value}} | db.col.find({“likes”:{$gt:50}}).pretty() |
大于或等于 | { key:{$gte:value}} | db.col.find({“likes”:{$gte:50}}).pretty() |
不等于 | { key:{$ne:value}} | db.col.find({“likes”:{$ne:50}}).pretty() |
模糊查询
- 查询 title 包含"教"字的文档: db.col.find({title:/教/})
- 查询 title 字段以"教"字开头的文档:db.col.find({title:/^教/})
- 查询 titl e字段以"教"字结尾的文档:db.col.find({title:/教$/})
- 读取指定数量的数据记录 — Limit
db.COLLECTION_NAME.find().limit(num)
- 跳过指定数量的数据 — skip
db.COLLECTION_NAME.find().limit(num).skip(num)
- 排序
使用 sort() 方法对数据进行排序
db.COLLECTION_NAME.find().sort({KEY:1}) — 1为升序,-1为降序
MongoDB可视化工具 (Robo3T) 或 adminMongo
git clone https://github.com/mrvautin/adminMongo.git
熟悉可视化工具的操作流程
在Express中利用Mongoose操作MongoDB
Mongoose 是一个让我们可以通过Node来操作MongoDB数据库的一个模块
- Schema(模式对象)
——Schema 对象定义约束了数据库中的文档结构
- Model
——Model 对象作为集合中的所有文档的表示,相当于MongoDB中的collection,它的每一个实例就是一个document文档
- Document
——Document表示集合中的具体文档,相当于collection中的一个具体文档
关系:Schema生成Model,Model创造Document
- Mongoose的使用方式
- 下载安装Mongoose(npm i mongoose --save)
- 项目中引入mongoose(const mongoose = require(‘mongoose’))
- 连接MongoDB数据库(mongoose.connect(‘mongodb://数据库ip地址 : 端口号( 默认端口27017可以省略 )/数据库名’))
- 数据库连接成功事件(mongoose.connection.once(‘open’ , () => {}))
- 数据库断开事件(mongoose.connection.once(‘close’ , () => {}))
- 创建Schema对象(约束数据)
- const Schema = mongoose.Schema
var stuSchema = new Schema({ name: String, gender: { type: String, default: 'male' } }, { timestamps: true (自动添加createdAt和updatedAt)
})
- 将stuSchema映射到一个MongoDB collection并定义这个文档的构成(var stuModle = mongoose.model(‘User’, stuSchema, ‘user’)) 这里注意点三个参数,如果不加会自动把collection定义成复数形式
- 增删改查操作
- 查找数据 (stuModle.find({条件}), fn)
- 增加数据 ( new UserModel({}).save())
- 删除数据 (UserModel.deleteOne({条件}, fn)) remove
- 修改数据 (UserModel.updateOne({条件}, fn))
模式(Schemas)
支持的字段类型
类型 | 作用 |
---|---|
String | 定义字符串 |
Number | 定义数字 |
Date | 定义日期 |
Buffer | 定义二进制 |
Boolean | 定义布尔值 |
Mixed | 定义混合类型 |
ObjectId | 定义对象ID |
Array | 定义数组 |
启动Node.js管理系统项目
- 建立github仓库
- 利用Express分别构建WebServer与APIServer