Node.JS
fs文件系统模块
使用fs模块需要先在js代码中导入fs模块
const fs=require('fs')
fs.readFile() --读取文件
同步:fs.readFileSync()
语法:
fs.readFile(path[,options],callback)
//path 文件路径
//options 编码 一般是utf-8
//callback 接受返回值的回调函数
与回调函数并用
fs.readFile('PATH','utf-8',(err,data)=>{
//函数内容
})
//err 失败返回值
//data 成功返回值
fs.writeFile()--写入文件
语法:
fs.writeFile(file,data[,option])
//file 文件或文件路径
//data 写入的内容
http
http
const http=require('http')
创建服务器
//创建web服务器
const serve=http.createServer((req,res)=>{
//设置响应体
res.end('Heelo HTTP Server')
//响应体中有中文乱码解决方法
res.setHeader('content-type','text/html;charset=utf-8')
})
启动服务器
server.listen(8000,'127.0.0.1',()=>{
console.log("服务器已经启动")
})
//8000 端口号
//127.0.0.1 本地主机的IP地址
//callback函数 在服务器启动时立即执行
注意事项:
一.
//http协议的默认端口号是80.https协议的默认端口号是443.
//http常见服务器开发常用端口有3000 8080 8090 9000
二.
//端口号被占用:
1.关闭当前正在运行的监听端口服务
2.换一个端口号
三.
//停止服务:CTRL + C
获取http请求报文
1.请求方法
req.method
2.请求版本
req.httpVersion
3.请求路径
req.url
//只包含url中的路径与查询字符串,并没有端口,协议的版本等内容
4.请求头
req.headers
5.请求体
const serve=http.createServer((req,res)=>{
})
URL
const url=require('url')
url.parse()--解析
//解析res.url
let res=url.parse(req.url)
//pathname=res.pathname
查询字符串
let res=url.parse(req.url,ture)
res.query.keyword
const serve=http.createServer((req,res)=>{
//路由,与文件和文件夹无关
const pathname=req.url
//使用if语句实现路由
if(pathname==='/first'){
res.end('This is first')
}else if(pathnem==='/Second'){
res.end('This is Second')
}else{
//增加HTTP状态码到响应中
res.writeHead(404,{
'content-type':'text/html'//设置响应标题
})
red.end('<h1>Page not found!</h1>')
}
})
绝对路径
-
https://www.baidu.com/ //在外连接经常使用 -
//www.baidu.com/ //大型网站用的较多 -
/web //与页面url协议,主机名,端口拼接
相对路径
相对路径发送时,与当前页面URL路径进行拼接计算后得到完整的URL
例如:
https://nodejs.cn/api-v18
1.
形式:modules.html#__dirname
最终:https://nodejs.cn/api-v18/modules.html#__dirname
2.
形式:./css/app
最终:https://nodejs.cn/css/app
一个.表示进入上一层目录
3.
形式:../img/logo
最终:https://nodejs.cn/img/logo
注意: 原本应该进入上两层目录,但是因为一个点已经是最外层了,无法在往上一层了
设置mime类型
HTTP服务可以设置响应头Content-Type 来表示响应体的MINE类型
结构:
[type]/[subType]
//text/html text/css text/javascript
//image/png image/ipg image/gif
//video/mp4
//audio/mpeg
//application/json
GET和POST请求
GET请求情况:
- 在地址栏直接输入url访问
- 点击a链接
- link引入的css
- script引入的js
- video与audio引入多媒体
- img标签引入图片
- form标签的method为get
- ajax的get
POST请求情况:
- form标签的method为post
- ajax的post请求
GRT与POST请求的区别
- get主要用来获取数据,post主要用来提交数据
- get带参数请求是将参数缀到url之后,而post是放入请求体之中
- post请求相对get安全
- get请求大小有限制一般为2k,而post请求没有大小限制
模块化
模块化:将一个复杂的程序按照一定的规则拆成多个文件
程序编码是按照一个一个模块编码的,整个项目就是一个模块化的项目
//模块化的好处:
1.防止命名冲突 可以在两个模块声明同一变量
2.高复用性 在外部声明函数,可以多个模块调用
3.高维护性 一个人可以维护升级自己负责的模块
模块暴露数据
一.module.export 可以暴露任意数据
--module是一个对象--
module.export='Cyyy1' 正确
二.export
export='Cyyy1' ×错误
export.Cyyy1=Cyyy1 正确
注意:
module.export===export ture
所以 export=module.export={}
三.导入模块
const abc=require('path')
导入时候找的是module.export而不是export所以export不能暴露任意数据
导入文件模块
const abc=require('path')//建议使用相对路径(不能省略./和../)
注意:
1.导入其他类型文件会以js文件出力
2.js和json文件后缀可以省略,但会最先检查js文件
3.如果导入的是一个文件夹,则会先检查文件夹中package.json文件的main属性对应的文件,存在则导入,不存在则会报错。如果main属性或者package.json不存在,则会尝试导入index.js和index.json,如果没找到则会报错
4.导入node.js内置模块,直接输入模块名字即可,无需添加./和../
包管理工具
Node Package Manager:
npm是node.js内置的包管理工具,在安装node.js时会自动安装npm
包的初始化
npm init 初始化工具包(创建一个package.json文件)
用来初始化生成package.json文件。在这个过程中会向用户提问一系列问题,如果你觉得不用修改默认配置,一路回车就可以了。
注意
1.名字不能大写和中文,默认值是文件夹名字
2.version版本号要求x.x.x形式
3.license证书,JSC证书和MIT证书功能上是相同的
4.description 包的描述
5.mian 包的入口文件
6.script{ 脚本配置
}
npm搜索包
搜索方式:
1.终端命令行中搜索
npm -s ‘关键字’
2.网站搜索:npm (npmjs.com)
npm下载包
必须先初始化才能安装包
生产依赖和开发依赖
-
生产依赖:既在开发中使用也在最终运行中使用
-
开发依赖: 只在开发中运行
不论是生产依赖的包还是开发依赖的包都会存在package.json,且两者都是局部安装只能在对应的文件夹使用。
全局安装
可以执行 -g 进行全局安装
npm i -g 包
例如
npm i -g nodemon
//全局安装完之后就可以自动重启node应用程序
注意:
- 可以通过
npm root -g查看全局安装包的位置 - 不是所有的包都适合全局安装,需自行查阅官方文档
安装包的所有的依赖
npm -i
安装指定版本的包
格式:
npm i 包名@版本号
例如:
npm i jquery@1.11.2
删除包
-
局部删除
//简写 npm r jquery //全写: npm remove jquery -
全局删除
npm r -g nodemon
npm配置别名
首先在package.json文件中找到script属性
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
在script属性中添加别名
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",//记得打逗号
"别名": "node 文件地址",
"start": "node 文件地址",
},
此时
node 文件地址 ==npm run 别名 ==npm start
//注意:
1.当别名是start时可以省略run,一般用来启动项目
2.npm run 有上级目录查找的特性
cnpm
地址:
https://npmmirror.com/
yarn
安装代码:
npm i -g yarm
npm和yarn的区分:
npm 和 Yarn 创建的锁文件不同package-lock.json和yarn.lock
发布一个包
nvm
nvm:node 版本管理器,也就是说:一个 nvm 可以管理多个 node 版本(包含 npm 与 npx),可以方便快捷的 安装、切换 不同版本的 node。
github下载地址:Releases · coreybutler/nvm-windows · GitHub
1. nvm list - 显示版本列表
nvm list :显示已安装的版本(同 nvm list installed
nvm list installed:显示已安装的版本
nvm list available:显示所有可以下载的版本
2. nvm install - 安装指定版本nodejs
nvm install 14.5.0:安装 14.5.0 版本的 node.js
nvm install latest:安装最新版本
3. nvm use - 使用指定版本node
nvm use 14.5.0: 切换到 14.5.0 版本的 node.js
4. nvm uninstall - 卸载指定版本 node
nvm uninstall 14.5.0:卸载到 14.5.0 版本的 node.js
注意:在运行nvm install 的时候,有可能会出现无权限安装的问题,请 以管理员身份运行 cmd
express框架
express简介
简单来说,express是一个封装好的工具包
Express 框架核心特性:
- 可以设置中间件来响应 HTTP 请求。
- 定义了路由表用于执行不同的 HTTP 请求动作。
- 可以通过向模板传递参数来动态渲染 HTML 页面。
安装 Express
npm i express
安装完后,我们可以查看下 express 使用的版本号:
npm list express
请求和响应:
Express 应用使用回调函数的参数: request 和 response 对象来处理请求和响应的数据。
app.get('/', function (req, res) {
// --
})
Request 对象 - request 对象表示 HTTP 请求,包含了请求查询字符串,参数,内容,HTTP 头部等属性。常见属性有:
- req.app:当callback为外部文件时,用req.app访问express的实例
- req.baseUrl:获取路由当前安装的URL路径
- req.body / req.cookies:获得「请求主体」/ Cookies
- req.fresh / req.stale:判断请求是否还「新鲜」
- req.hostname / req.ip:获取主机名和IP地址
- req.originalUrl:获取原始请求URL
- req.params:获取路由的parameters
- req.path:获取请求路径
- req.protocol:获取协议类型
- req.query:获取URL的查询参数串
- req.route:获取当前匹配的路由
- req.subdomains:获取子域名
- req.accepts():检查可接受的请求的文档类型
- req.acceptsCharsets / req.acceptsEncodings / req.acceptsLanguages:返回指定字符集的第一个可接受字符编码
- req.get():获取指定的HTTP请求头
- req.is():判断请求头Content-Type的MIME类型
Response 对象 - response 对象表示 HTTP 响应,即在接收到请求时向客户端发送的 HTTP 响应数据。常见属性有:
- res.app:同req.app一样
- res.append():追加指定HTTP头
- res.set()在res.append()后将重置之前设置的头
- res.cookie(name,value [,option]):设置Cookie
- opition: domain / expires / httpOnly / maxAge / path / secure / signed
- res.clearCookie():清除Cookie
- res.download():传送指定路径的文件
- res.get():返回指定的HTTP头
- res.json():传送JSON响应
- res.jsonp():传送JSONP响应
- res.location():只设置响应的Location HTTP头,不设置状态码或者close response
- res.redirect():设置响应的Location HTTP头,并且设置状态码302
- res.render(view,[locals],callback):渲染一个view,同时向callback传递渲染后的字符串,如果在渲染过程中有错误发生next(err)将会被自动调用。callback将会被传入一个可能发生的错误以及渲染后的页面,这样就不会自动输出了。
- res.send():传送HTTP响应
- res.sendFile(path [,options] [,fn]):传送指定路径的文件 -会自动根据文件extension设定Content-Type
- res.set():设置HTTP头,传入object可以一次设置多个头
- res.status():设置HTTP状态码
- res.type():设置Content-Type的MIME类型
路由
路由决定了应用程序如何去响应客户端对特定端点的请求。
在HTTP请求中,我们可以通过路由提取出请求的URL以及GET/POST参数。
var express = require('express');
var app = express();
// 主页输出 "Hello World"
// GET请求
app.get('/', (req, res)=> {
console.log("主页 GET 请求");
res.send('Hello GET');
});//只有当请求是get且请求路径是'/’时候才会执行回调函数
// POST 请求
app.post('/', (req, res)=> {
console.log("主页 POST 请求");
res.send('Hello POST');
});//只有当请求是POST且请求路径是'/’时候才会执行回调函数
// ALL
app.all('/', (req, res)=> {
res.send('Hello');
});
//通配符*
app.all('*',(req,res)=>{
res.end('Hello')
})
获取请求报文参数
- req.path:获取请求路径
- req.query:获取URL的查询参数串
- req.ip: 获取ip
- req.get():获取指定的HTTP请求头
例如获取 host请求头
req.get('host')
获取路由参数
- req.params:获取路由的parameters
express响应
且不会出现中文乱码
express中间件
中间件本质就是一个回调函数
中间件的作用就是使用函数封装公共操作,简化代码
中间件的类型:
- 全局中间件
每一个请求都要约束
- 路由中间件
一部分请求约束
静态资源中间件
Express 提供了内置的中间件 express.static 来设置静态文件如:图片, CSS, JavaScript 等。
你可以使用 express.static 中间件来设置静态文件路径。例如,如果你将图片, CSS, JavaScript 文件放在 public 目录下,你可以这么写:
app.use(express.static('public'));
防盗链
防盗链的实现可以通过设置HTTP Header中的Referer实现。当浏览器向服务器发送请求的时候,请求头中包含了Referer用于告诉服务器这个请求是来自哪里的,服务器可以借助这个字段进行防盗处理。后台可以获取到请求中的referer,如果请求来源不是本站则进行阻止或返回其他页面。 如果Http头不包含referer,也就是通过浏览器地址栏直接访问该资源URL。
EJS模板引擎
官网:EJS -- 嵌入式 JavaScript 模板引擎 | EJS 中文文档 (bootcss.com)
EJS是什么
“E” 代表什么?可以表示 “可嵌入(Embedded)”,也可以是“高效(Effective)”、“优雅(Elegant)”或者是“简单(Easy)”。EJS 是一套简单的模板语言,帮你利用普通的 JavaScript 代码生成 HTML 页面。EJS 没有如何组织内容的教条;也没有再造一套迭代和控制流语法;有的只是普通的 JavaScript 代码而已。
模板引擎是分离html和js的
安装
利用 NPM 安装 EJS 很简单。
npm install ejs