一、初识Node.js
1.基于chrome v8
引擎的js
运行环境
2.v8
引擎:chrome
的js
解析引擎,C++
开发,单线程,可独立运行
3.运行环境:①类似虚拟机,提供js
在服务端运行的环境
②js
工具库:扩展了js
在服务端的功能
二、环境安装
1.Node.js
必须先安装再使用 -- 有很多版本
2.安装方式:①下载包安装:添加到环境变量
版本更新:重新下载安装
②NVM
:多版本切换
3.查看是否安装成功:node -v ----命令行
4.注意:①安装环境不要出现中文
②添加到环境变量
③查看是否安装成功 : $ node -v
REPL
环境
1.类似开发者工具中的console
2.进入REPL
环境:打开命令行:node + 回车
3.退出REPL
环境:ctrl+c
或者process.exit()或.exit
4.执行js
文件:node*.js
或node demo(文件默认为``js
)`
全局作用域成员
1.global
:全局环境 ,类似window
2.globalThis
:ES6
新增的全局对象,浏览器端指向window
,服务端指向global
3.process
:获取当前的node进程信息
4.console
:node
内置的控制台模块,类似客户端的console
5.Buffer
:用于处理二进制的数据
Bable
1.ES6
转码器:将ES6
转为ES5
-- 可以使用ES6
编写程序,然后将代码转化为ES5
适应老版本浏览器
2.安装:$ npm install --save-dev @babel/core
3.配置文件:.babelrc
-- 项目根目录
{ "presets": [ "@babel/env"], //转码规则 "plugins": [] //插件 }
4.转码规则:官方提供,可通过npm
安装
$ npm install --save-dev @babel/preset-env
5.命令行转码工具:$ npm install --save-dev @babel/cli
$ npx babel es6.js -- 转码之后输出到控制台 $ npx babel es6.js -o es5.js -- 将es6.js文件转码之后写入到es5.js文件 npx:npm5之后新增的功能,帮助去调用局部安装的工具
process.stdout.write('\033[0f');
process.stdout.write('\033[2J');
Node.js核心优势
-
单线程
-
非阻塞式I/O -- 异步编程,错误优先(回调函数的第一个参数是error)
模块化结构CommonJS
1.使用CommonJs规范 -- 运行时加载 ,同步加载
2.Node.js
模块分类:①核心模块:平台自带
②第三方模块:包
③文件模块:自己开发的
3.module对象:Node.js内部提供,所有模块都是module的实例
4.导出:exports或module.exports
exports.name = val; module.exports = {name:val} 注意:exports为module.exports别名,导出最终以module.exports为准
5.导入:require
规则一:以:./或../开头的路径以当前文件所在的文件夹开始寻找模块 require("./module.js"); //加载当前目录下的module.js模块 require("./module"); // 省略扩展名则按js文件执行 规则二:以/开头则以系统根目录(当前文件所在的目录)开始寻找模块 require("/module/demo.js"); //加载当前文件所在根目录目录根据路径开始寻找 规则三:不以./或../或/开头 1:以核心模块加载 require("http"); 2:从当前目录开始依次向上查找node_modules目录 规则四:路劲是一个文件夹 1.查找文件夹下是否有package.json中main字段指向的文件 require("./path") 2.不存在package.json或者没有main字段,指向index.js
一、模块化结构
1.分类:①内置模块:Node.js系统自带模块 -- require("module")
②第三方模块:别人开发好放到网上,可以直接下载使用
使用步骤1.NPM下载
2.require("module")
③文件模块:自己开发的模块 -- require("./module")
2.核心模块:Http
:提供web服务功能
path
:处理文件路径的模块
fs
:处理文件的模块
url
:用于解析URL
queryString
:解析URL查询字符串模块
crypto
:提供加密解密的模块
util
:提供常用函数的集合
child_process
:子进程模块
OS
:与操作系统交互模块
3.CMS
:内容管理系统 (管理员模块、)
OA
:办公自动化
CRM
:客户关系管理系统
ERP
:企业资源计划
二、http模块
1.作用:提供web服务功能
2.方法:http.createSever()
:创建一个web服务器的方法
http.createServer((request,response)=>{ //request:用户请求 request.url //response:服务器应答 }).listen(端口号);
3.response:由http服务器内部创建的,表示服务器对于request的应答
response.writeHead(状态码[,状态码描述][,头 {key:val;key2:val2}]):响应的头信息 response.setHeader(key,val):设置响应头 response.write(data):响应正文,可以多次响应 response.end([data]):表示响应结束,每一次request都必须有一个end(),end()之后不能再次write() -- 只能有一次
三、URL模块
1.作用:用于网址的处理和解析
2.API:①旧版:只能用于node.js的特定版本
const url = require("url"); const reqUrl = url.parse(urlString);
②新版:与浏览器相同的API
:兼容浏览器 -- 推荐
const reqStr = new URL(request.url,baseUrl);
四、路由
1.根据请求的URL和参数(get 和 post)来决定访问的页面和要执行的代码
2.路由规则:
后端: /admin/模块/具体页面 默认访问:后台首页 -- 验证用户是否登录 /admin/user/register:后台用户注册模块 前台:/模块/具体页面 默认访问:前台首页 -- http://localhost:8888或http://localhost:8888/index
五、MVC
作用:代码结构化思想
1.Model
:M
,模型层 -- 数据处理层
2.View
:V
,视图层
3.Controller
:C
,控制器,业务逻辑层
4.单入口:所有的访问都通过同一个文件,一个项目只有一个入口文件
5.多入口:可以通过多个入口访问文件,
项目结构: index.js:入口文件 public:公共资源目录 -admin:后台资源目录(后台模板的images,css,js等) -images,css,js,fonts -images:前台的图片目录 -css:前台的样式目录 -js:前台的js目录 -fonts:前台的字体目录 tpl:模板目录(前台和后台的html页面) -admin:后台模板 -admin:用户目录模块 index.html:后台用户首页模板 -add.html:后台用户新增模板 -edit.html:后台用户编辑模板 -index.html:前台首页模板 module:服务端的js目录 -db:模型层目录 -db.fun.js:数据库处理文件 -controller:控制器目录(业务逻辑层) -admin:后台控制器目录 -admin.js:用户模块的控制器(用户模块的业务逻辑) -category.js:分类模块的业务逻辑 -util:通用方法的目录 -page.fun.js:分页模块 -init:项目初始化 -server.js:web服务模块 -router.js:路由模块
一、fs
1.作用:与文件系统交互 -- 对文件的增、删、改、查
2.方法:fs.readFile(path[,options],(err,data)=>{})
:异步读取文件内容
注意:路径为绝对路径
二、path模块
1.作用:用于处理文件和目录的路径(根据平台规范文件或文件夹的路径)
2.方法:path.join([...paths])
:按照特定平台使用分隔符将给定的路径规范化生成一个新的路径(将多个路径片段拼接成一个完整路径)
path.basename(path[,ext]):
获取path的最后一部分,如果ext不省略,则会被忽略
(文件名及扩展名)
path.dirname(path):
截取path目录部分(返回路径中的目录)
path.extname()
:返回扩展名
全局变量:
3.__dirname
:返回当前文件所在的目录(不包含文件名) -- 全局变量
4.__filename:返回当前文件所在的具体路径(包含文件名) -- 全局变量
三、静态资源加载
1.MIME Type
:媒体类型(内容类型),与文件后缀对应,用来给媒体资源设置正确的类型以此正常显示资源
1.设置正确的MIME Type
2.读取 -》 返回(设置Content-Type
)
.html .htm -- text/html .jpg -- image/jpeg .jpeg -- image/jpeg .png -- image/png .gif -- image/gif .css -- text/css .js -- text/javascript .mp3 -- audio/x-mpeg .mp4 -- video/mp4 .json -- application/json .gif -- image/gif
获取请求数据
1.get
请求:数据通过URL
提交,当通过URL API
处理后,请求字符串存储search
中,请求数据对象在searchParams
中
1.旧版 const queryString = require("queryString"); //查询字符串处理模块 let data = queryString.parse(url.search); //返回键值对集合 //let reqUrl = url.parse(req.url) //旧版URL API //let params = queryString.parse(reqUrl.search.slice(0,len1) 2.新版 2.1:如果使用新版的URL API ,那么直接就是url.searchParams 2.2:如果是旧版的URL API let data = new URLSearchParams(url.search); data.append(k,v):追加键值对,同名的会保留 data.set(k,v):设置键、值,同名的会覆盖
2.post
请求: request
中没有专门用于处理post请求的属性,只能通过监听事件来获取数据
通过请求体来传递参数
let data = ""; request.on("data",chunk=>data+=chunk;) //数据传递中 data就是传递的参数 request.on("end",()=>data); //数据传输完毕触发end data:x=1&y=2
MySql
数据库
1.作用:存储数据的仓库
2.分类:mysql
,oracle
,Sql Server
MongoDB
...
3.使用:安装对应的数据库 -》 开启服务
4.工具:Navicat
1.创建连接:主机名:数据库服务器所在的主机名或ip -- localhost或127.0.0.1 端口号:3306 用户名:登录数据库时的账号 -- root 密码:登录数据库时的密码 -- root 2.创建数据库:数据库名,编码 登录数据库 - 具体数据库名 - 表 - 字段 3.创建表: 1.字段名:数据存储的名字 2.类型:字符串:char:最大长度255,定长, varchar:最大长度为255,变长,指定长度 text:大文本 3.主键:数据的唯一标识,设置成一个递增的整数,不能重复
表:
字段:名字,类型(类似js数据类型),默认值,是否为空,是否是主键 主键:数据的唯一性标识,整型,从1开始,依次递增,不会被覆盖 类型:字符串:char:最大长度255,定长, varchar:最大长度为255,变长,指定长度 text:大文本
SQL
语句
1.结构化查询语言,用来对数据库进行CURD
-- 跨平台、跨语言
2.课程内容:对表内容的CURD
mysql -u 数据库名 -p; 打开数据库 show databases; -- 显示所有的数据库 use h2201; -- 进入某个数据库 show table;-- 显示某个表 SELECT * FROM `admin`;
新增(INSERT)
INSERT INTO `table` (`name1`,`name2`...) VALUES (val1,val2...) -- 给指定的字段添加指定的值(字段先后顺序无瓜) INSERT INTO `table` VALUES(val1,val2...); -- 直接添加一条数据(省略字段名,值按照字段在表中的顺序一一对应,包括所有字段) 注意:字段和值按顺序一一对应 -- 个数,类型,顺序 字符串类型的值必须加引号(单双引号)
删除(DELETE)
DELETE FROM `table`; -- 删除所有表的数据 DELETE FROM `table` WHERE condition; -- 按条件删除满足的数据
修改(UPDATE)
UPDATE `table` SET `name`="val",`name2`="val2" -- 将表中所有的数据name设置为val1,name2设置为val2 UPDATE `table` SET `name`="val",`name2`="val2" WHERE condition -- 按条件修改数据
查询(SELECT)
SELECT * FROM `table` -- 查询table的所有字段所有数据 SELECT * FROM `table` WHERE condition; -- 按条件查询数据 SELECT * FROM `table` WHERE `name`="val" -- 查找所有name为val的数据 SELECT * FROM `table` WHERE `name` LIKE "%val%" -- 查找所有name中包含val的数据(模糊查询) SELECT * FROM `table` WHERE condition AND condition2 -- 查找所有满足condition和condition2的数据 SELECT * FROM `table` WHERE condition OR condition2 -- 查找所有满足condition或condition2的数据 SELECT * FROM `table` WHERE `name` IN ("val1","val2"...) -- 查找所有name为val1和val2的数据 SELECT * FROM `table` ORDER BY `name` ASC/DESC -- 数据按name升序(ASC,默认)/降序(DESC) SELECT * FROM `table` LIMIT [start=0,]len; -- 查询所有满足条件从start开始,len条数据 SELECT `name`,`name2` AS `names` FROM `table` -- 查询特定字段+字段别名 SELECT `name`,`name2` AS `names` FROM `table` [WHERE condition] [ORDER BY `name` [ASC/DESC]] [LIMIT [offset=0,]len]
NPM
1.Node.js
包管理器,随着Node.js
一起安装
2.包:第三方模块,别人开发好某些功能,可以直接下载使用
3.常用NPM命令
$npm -v:查看当前npm版本 $npm install package -- 将包下载到当前目录并写入生产环境dependiencied $npm install package --save/-S; 作用同上 $npm install package --save-dev/-D; 将包下载到本都并写入到devDenpendencies $npm install package -g -- 将包作为全局包下载(全局工具) $npm root -g -- 查看全局安装包路径 $npm init -- 项目初始化(生成package.json package-lock.json) $npm uninstall package -g/-s/-d : 卸载包 $npm config ls -l -- 查看npm配置 $npm get registry -- 获取当前npm源地址 $npm set registry https://registry.npm.taobao.org :设置新的源 $npm install -- packagae.json:项目配置文件 { "main":"index.js", //入口文件 "dependencies":{} //生产环境依赖 "devDependencies":{} //开发环境依赖 }
4.官网:package - npm
5.其他工具:yarn
,pnpm
,cnpm
导入第三方包:const package = require("package")
crypto
UPDATE admin
SET pwd
= md5("123456") WHERE uid
= 2;
1.作用:提供了加密功能,其中包括了用于OpenSSl散列、HMAC、加密、解密、签名、以及验证的函数的一整套封装
-
md5加密:
crypto.createHash("md5").update(data.get("pwd")).digest("hex")
3.数据库加密:
UPDATE `admin` SET `pwd`=md5("password") WHERE condition
模板引擎
1.作用:给模板页传递服务端的数据,并渲染在页面中
2.分类:art-template,jade
,ejs
3.`art-template使用: 同时支持客户端和服务端
1.安装art-template:npm install art-template --save 2.引入art-template:const template = require("art-template") 3.加载模板:let html = template(模板的绝对路径,{key:val}(参数)) 4.响应给客户端: res.writeHead(200,{"Content-Type":"text/html";charset=utf-8}) res.end(html); 客户端:变量输出
客户端COOKIE
1.是浏览器的一种能力,面向客户端及服务端开放
2.浏览器端的cookie
属于document
3.创建cookie
:
document.cookie = "name=val;max-age=10;..." expires:过期时间 -- 日期格式 max-age:最大保存时间 -- 秒 默认为保存时间为session:关闭浏览器(页面)即销毁 domain:当前cookie应用的域名范围 -- 默认为当前域名 path:当前cookie应用的文件夹范围 -- 默认为当前文件夹,"/"表示所有文件夹都可以访问
4.读取cookie
:document.cookie
-- 字符串(处理)
5.销毁cookie
document.cookie = "name=;max-age=-1";
6.注意:1.cookie
运行在服务器环境中 - 不能以本地文件的形式访问
2.cookie
保存在客户端,具体与浏览器设置有关
3.cookie
通过Headers
传递
4.cookie
保存的数据大小为5KB左右,具体与浏览器有关
5.cookie
兼容性好,所有浏览器都支持
6.安全性较低
服务端cookie
1.设置服务端cookie
response.setHeader("Set-Cookie",["name=val,path=/,max-age=60,httpOnly...","name2=val2,path=/..."]); -- 原生写法 httpOnly:设置服务端的cookie是否能被客户端访问,
2.使用cookie模块:①序列化cookie的值为一个cookie Header
的字符串
②将获取的cookie Header 字符串转换为键值对对象
1.安装cookie:npm install cookie -s 2.导入cookie:const cookie = require("cookie");
3.cookie
获取:
1.客户端: document.cookie => name=val; name2=val2;... let cookies = Object.assign({},...document.cookie.split(";").map(v=>{ let tmp = v.split("=") //[name,val] }))
art-template
1.模板中遍历:
1.默认值为$value,索引为$key {{each list}} 索引:{{$index}} 值:{{$value}} {{/each}} 2.自定义索引和值的变量名 {{each list val key}} 索引:{{key}} 值:{{val}} {{/each}}
Axios
1.是一个基于 Promise
的 HTTP
库,可以用在浏览器和 Node.js
中
2.安装:1.使用npm
:npm install axios -s
2.使用<script>
标签引入
3.注意:引入成功,会注册一个全局axios
对象
4.特点:①可用于客户端:使用promise发送http
请求
②也可用于服务端:使用node.js
发送请求
③拦截式及响应
④自动转换json
格式
5.安装:①使用Axios
包:安装-》导入
②使用axios.min.js
文件:<script>标签
6.注意:导入axios
后,axios
则会成为一个全局对象