node.js学习笔记

116 阅读12分钟

Node.JS

fs文件系统模块

使用fs模块需要先在js代码中导入fs模块

const fs=require('fs')

fs.readFile() --读取文件

同步:fs.readFileSync()

语法:

fs.readFilepath[,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{ 脚本配置
}

image-20230724094700383转存失败,建议直接上传图片文件

npm搜索包

搜索方式:

1.终端命令行中搜索

npm -s ‘关键字’

2.网站搜索npm (npmjs.com)

npm下载包

必须先初始化才能安装包

image-20230724101912485转存失败,建议直接上传图片文件

生产依赖和开发依赖

  • 生产依赖:既在开发中使用也在最终运行中使用

  • 开发依赖: 只在开发中运行

不论是生产依赖的包还是开发依赖的包都会存在package.json,且两者都是局部安装只能在对应的文件夹使用。

image-20230726103758969转存失败,建议直接上传图片文件

全局安装

可以执行 -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

image-20230728151644342转存失败,建议直接上传图片文件

npm和yarn的区分:

npm 和 Yarn 创建的锁文件不同package-lock.json和yarn.lock

发布一个包

image-20230728152215394转存失败,建议直接上传图片文件

image-20230728152239963转存失败,建议直接上传图片文件

nvm

nvmnode 版本管理器,也就是说:一个 nvm 可以管理多个 node 版本(包含 npmnpx),可以方便快捷的 安装切换 不同版本的 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 应用使用回调函数的参数: requestresponse 对象来处理请求和响应的数据。

app.get('/', function (req, res) {
   // --
})

Request 对象 - request 对象表示 HTTP 请求,包含了请求查询字符串,参数,内容,HTTP 头部等属性。常见属性有:

  1. req.app:当callback为外部文件时,用req.app访问express的实例
  2. req.baseUrl:获取路由当前安装的URL路径
  3. req.body / req.cookies:获得「请求主体」/ Cookies
  4. req.fresh / req.stale:判断请求是否还「新鲜」
  5. req.hostname / req.ip:获取主机名和IP地址
  6. req.originalUrl:获取原始请求URL
  7. req.params:获取路由的parameters
  8. req.path:获取请求路径
  9. req.protocol:获取协议类型
  10. req.query:获取URL的查询参数串
  11. req.route:获取当前匹配的路由
  12. req.subdomains:获取子域名
  13. req.accepts():检查可接受的请求的文档类型
  14. req.acceptsCharsets / req.acceptsEncodings / req.acceptsLanguages:返回指定字符集的第一个可接受字符编码
  15. req.get():获取指定的HTTP请求头
  16. req.is():判断请求头Content-Type的MIME类型

Response 对象 - response 对象表示 HTTP 响应,即在接收到请求时向客户端发送的 HTTP 响应数据。常见属性有:

  1. res.app:同req.app一样
  2. res.append():追加指定HTTP头
  3. res.set()在res.append()后将重置之前设置的头
  4. res.cookie(name,value [,option]):设置Cookie
  5. opition: domain / expires / httpOnly / maxAge / path / secure / signed
  6. res.clearCookie():清除Cookie
  7. res.download():传送指定路径的文件
  8. res.get():返回指定的HTTP头
  9. res.json():传送JSON响应
  10. res.jsonp():传送JSONP响应
  11. res.location():只设置响应的Location HTTP头,不设置状态码或者close response
  12. res.redirect():设置响应的Location HTTP头,并且设置状态码302
  13. res.render(view,[locals],callback):渲染一个view,同时向callback传递渲染后的字符串,如果在渲染过程中有错误发生next(err)将会被自动调用。callback将会被传入一个可能发生的错误以及渲染后的页面,这样就不会自动输出了。
  14. res.send():传送HTTP响应
  15. res.sendFile(path [,options] [,fn]):传送指定路径的文件 -会自动根据文件extension设定Content-Type
  16. res.set():设置HTTP头,传入object可以一次设置多个头
  17. res.status():设置HTTP状态码
  18. 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响应

image-20230729120228893转存失败,建议直接上传图片文件

且不会出现中文乱码

image-20230729120751564转存失败,建议直接上传图片文件

express中间件

中间件本质就是一个回调函数

中间件的作用就是使用函数封装公共操作,简化代码

中间件的类型:

  • 全局中间件

每一个请求都要约束

  • 路由中间件

一部分请求约束

静态资源中间件

Express 提供了内置的中间件 express.static 来设置静态文件如:图片, CSS, JavaScript 等。

你可以使用 express.static 中间件来设置静态文件路径。例如,如果你将图片, CSS, JavaScript 文件放在 public 目录下,你可以这么写:

app.use(express.static('public'));

image-20230730105419792转存失败,建议直接上传图片文件

防盗链

防盗链的实现可以通过设置HTTP Header中的Referer实现。当浏览器向服务器发送请求的时候,请求头中包含了Referer用于告诉服务器这个请求是来自哪里的,服务器可以借助这个字段进行防盗处理。后台可以获取到请求中的referer,如果请求来源不是本站则进行阻止或返回其他页面。 如果Http头不包含referer,也就是通过浏览器地址栏直接访问该资源URL。

image-20230730114059474转存失败,建议直接上传图片文件

EJS模板引擎

官网:EJS -- 嵌入式 JavaScript 模板引擎 | EJS 中文文档 (bootcss.com)

EJS是什么

“E” 代表什么?可以表示 “可嵌入(Embedded)”,也可以是“高效(Effective)”、“优雅(Elegant)”或者是“简单(Easy)”。EJS 是一套简单的模板语言,帮你利用普通的 JavaScript 代码生成 HTML 页面。EJS 没有如何组织内容的教条;也没有再造一套迭代和控制流语法;有的只是普通的 JavaScript 代码而已。

模板引擎是分离html和js的

安装

利用 NPM 安装 EJS 很简单。

 npm install ejs
实例

image-20230730225739470转存失败,建议直接上传图片文件

标签函数

image-20230730225819014转存失败,建议直接上传图片文件

文件上传