读写文件内容及小案例:
const fs=require('fs')
fs.readFile('./file/0.txt','utf-8',(err,data)=>{//读取文件
if(err){return console.log('文件读取失败')}
const perArr=data.split(' ')//依据空格分成数组
const newArr=[]
perArr.forEach(item=>{
newArr.push(item.replace(':','='))//对数组遍历,每一项符号进行替换操作
})
const str=newArr.join('\r\n')//将数组转化为字符串,用回车+换行符分割
//这里要用新数组接一下,因为返回的是新数组,原数组不变
fs.writeFile('./file/1.txt',str,(err)=>{
if(err){return console.log('文件写入失败')}
})
})
注:这里有路径问题,直接用绝对路径或者相对路径会出现不方便或路径拼接错误,所以以后路径都可以用:fs.readFile(__dirname+'/file/0.txt','utf-8',(err,data)=>{}
(常用)fs.readFile( path.join(__dirname,'/file/0.txt') , 'utf-8' , (err,data)=>{}
用之前要先引入path模块:const path=require('path')
serve:
IP地址与域名是一一对应的,域名更方便记忆与访问。两者之间是通过DNS进行解析(udp协议)的。在自己电脑上,127.0.0.1对应的域名是localhost.
URL:Uniform Resource Locator,统一资源定位符
URI:Uniform Resource Identifier,统一资源标志符
URL 是一种比较统一的带参数指向某个地址的格式。格式为:
[协议类型]://[访问资源需要的凭证信息]@[ 服务器地址]:[端口号]/[资源层级UNIX 文件路径][文件名]?[查詢]#[片段ID]
模块化&npm:
模块化一些注意点:
1.这里打印出来的会指向新对象,而不是原来的
2.module.exports&exports的理解,四种应用场景
注:为了避免混乱,,不要同时使用两种暴露方式。。。。。。。。。。。。。。
npm是一个以node内置模块为基础,作为第三方来提供包的包管理工具:node package manager
执行命令:npm init -y 创建package.json文件,这个文件用来记录安装了哪些包和版本号。 多人共同开发的情况下要将node_modules文件放在gitignore中,不要全上传.根据package.json再下载包就可使用。执行此命令的文件名不能出现中文和空格。。
执行命令:npm i 包名 -D / npm i 包名 --save-dev把安装的包记录在devDependencies节点中,只在开发时用到,上线后不用。
执行命令:npm i 包名 -g 全局安装,全局安装的包在文件夹npm-node_modules里可以查看到。
淘宝镜像的两种使用方式:
将md文件转化为html文件的一个包:
在node_modules文件夹下有安装的包的文件,每个包的文件也有package.json文件,里面有写main这个属性,属性内容是入口文件路径,即可开始运行。
模块加载机制:
Express:
res.send():向客户端发送信息
req.query():获取客户端请求参数 req.params():获取客户端动态请求参数
静态资源管理(可以通过路径访问到file文件夹的所有文件):①app.use(express.static('file'))②app.use('./file',express.static('file'))
注:app.use()作用是用来注册全局中间件
第一种写法:访问路径不出现file,如果托管的多个文件夹里有相同的文件名,则按先写的展示。
第二种写法:加一个文件的访问路径前缀,确保访问正确。
安装nodemon:执行命令nodemon 文件名 只要保存就会自动重启,不用手动一直执行命令了。
路由的模块化:
const express=require('express')//引入
const app=express()//创建一个实例
app.get('/user',(req,res)=>{})//实际开发中不会像这样直接在express的实例上挂载路由请求
const express=require('express')//引入
const router=express.Router()//创建一个路由模块
router.get('/user',(req,res)=>{})
module.exports=router//暴露出去
///另一文件
const express=require('express')
const app=express()
app.use(router)//放进来
app.listen()
基本中间件:分为全局中间件和局部中间件,注意书写顺序,先中间件再路由,程序是由上到下执行的。
//定义全局中间件
app.use((req,res,next)=>{
console.log('全局生效')
req.weight=130
next()
})
//定义局部中间件,写在要用它的路由里,作为中间的参数
const part1=function(req,res,next){
console.log('局部生效1')
next()
}
路由中间件:
错误中间件:
解析请求体(req.body)数据的中间件:
app.use( express.json() )
app.use( express.urlencoded( { extended:false } ) )
解决跨域问题:
cross-origin resource sharing(CORS)
const cors=require('cors')
app.use(cors())//利用中间件
设置允许的请求:
跨域的两种请求:简单请求(1次)和预检请求(2次)
jsonp:浏览器通过<script>标签的src属性,请求服务器上的数据时,服务器返回一个函数的调用。这种请求方式叫jsonp请求。
数据库:
在MySQL WorkBench中 查询、 增加 、更新、 删除/ where 、and、 or /count、 as
select * from my_db_01.users
select username,password from users -- 两种查询数据方式
insert into users (username,password) values ('tony','989898') --插入数据语句
update users set password='464646' where id=2 --更新某行一列数据
update users set password='282828',status='1' where id=1 --更新某行多列数据
delete from users where id=1 --删除某行数据
-- where子句 and、or运算符
select*from users order by status ASC --'ASC'写不写都行,默认也是按status升序排序
select*from users order by id DESC --按照id降序排序
select*from users order by status ASC,username DESC --多重排序,先按照status升序,再按照username降序
select count(*) from users where status=0 --查询status为0的数据条数
select count(*) as total from users where status=0--用as给列起别名
select username as una,password as pwo from users
在vs-code项目中安装mysql第三方模块:npm i mysql,与数据库建立联系
cookie:
用于session验证
session:
执行命令:npm i express-session安装session中间件。不跨域的情况推荐使用
JWT:
json web token
执行命令:npm i jsonwebtoken express-jwt安装两个包,第一个包用于生成jwt字符串,第二个是将客户端的jwt字符串解析还原成json对象的包。