Node.js

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是一个介于关系型数据库和非关系型数据库之间的产品,是非关系型数据库当中功能最丰富,最像关系型数据库的。

关系型数据库与非关系型数据库的区别

如图

关系型数据库
  1. 数据存储方式不同。关系型数据天然就是表格式的,因此存储在数据表的行和列中。数据表可以彼此关联协作存储,也很容易提取数据。
非关系型数据库
  1. 数据存储方式不同。非关系型数据不适合存储在数据表的行和列中,而是大块组合在一起。非关系型数据通常存储在数据集中,就像文档、键值对或者图结构。你的数据及其特性是选择数据存储和提取方式的首要影响因素。
MongoDB相比于关系型数据具备的优点
  • 高可扩展性
  • 分布式存储
  • 低成本
  • 结构灵活

命令行操作MongoDB

数据库常用命令
  1. 查看当前的数据库:db
  2. 查看所有的数据库:show dbs
  3. 切换数据库:use 数据库名称
  4. 删除当前的数据库:db.dropDatabase()
  5. 获取当前数据库的信息,比如Obj总数、数据库总大小、平均Obj大小等: db.stats() 如图
  6. 获取当前数据库中集合的信息 db.gps_point.stats() 如图
  7. 获取服务器的状态: db.serverStatus() 如图
  8. 查看当前DB版本: db.version();
  9. 查看当前db的链接机器地址: db.getMongo();
  10. 删除当前使用数据库: db.dropDatabase();
  11. 显示数据库操作命令,里面有很多的命令: db.help()
Collection 集合操作
  1. 创建一个聚集集合(table) db.createCollection(name, options);
  • name: 要创建的集合名称
  • options: 可选参数, 指定有关内存大小及索引的选项
字段描述
capped是否启用集合限制,如果开启需要制定一个限制条件,默认为不启用,这个参数没有实际意义
size限制集合使用空间的大小,默认为没有限制
max集合中最大条数限制,默认为没有限制
autoIndexId是否使用_id作为索引,默认为使用(true或false)

size的优先级比max要搞

  1. 得到指定名称的集合 db.getCollection(name)
  2. 查看已有集合: show collections 或 show tables
  3. 得到当前db的所有聚集集合: db.getCollectionNames()
  4. 删除集合 db.[collection].drop()
Document 文档操作
  1. 插入文档: db.COLLECTION_NAME.insert(document)
  2. 获得当前DB的所有文档 db.COLLECTION_NAME.find().pretty() – pretty 易读的方式来读取数据
  3. 更新文档
  • db.collection.update(查询条件,要更新的内容, { multi: true(是否全部更新) })
  • db.collection.save(文档数据) 方法通过传入的文档来替换已有文档,_id 主键存在就更新,不存在就插入
  1. 删除文档 db.collection.remove(query, justOne, writeConcern) 如果参数传递一个空对象则全部删除

query :(可选)删除的文档的条件。
justOne : (可选)如果设为 true 或 1,则只删除一个文档,如果不设置该参数,或使用默认值 false,则删除所有匹配条件的文档。
writeConcern :(可选)抛出异常的级别。

  1. 简单查询文档
  • findOne(): 它只返回一个文档。
  • and 多个条件查询 db.col.find({key1:value1, key2:value2}).pretty()
  • or 或者条件查询 db.col.find({$or:[{“by”:“条件1”},{“title”: “条件2”}]}).pretty()
集合查询
  1. 条件操作符
操作格式范例
等于{ 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:/教$/})
  1. 读取指定数量的数据记录 — Limit

db.COLLECTION_NAME.find().limit(num)

  1. 跳过指定数量的数据 — skip

db.COLLECTION_NAME.find().limit(num).skip(num)

  1. 排序

使用 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

  1. 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对象(约束数据)
  1. const Schema = mongoose.Schema
  2.  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定义成复数形式
  1. 增删改查操作
  • 查找数据 (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管理系统项目

  1. 建立github仓库
  2. 利用Express分别构建WebServer与APIServer
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

半生过往

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值