Chrome浏览器:V8引擎、IE浏览器:chakra查克拉
2.JavaScript可以操作DOM和BOM是因为浏览器提供了对应的API接口(API函数)
3.运行环境:指代码正常运行所必须的环境。例:浏览器中的运行环境:浏览器提供API接口->js调用API接口->js引擎执行代码
补充:终端:操作系统中专门为开发人员设计的,用于人机交互的一种方式
运行指令:nodemon / node + 执行的文件名称
定义:一个基于V8引擎可以运行JavaScript的运行环境
node终端中的快捷键
定义:node中用来操作文件的模块。提供了一系列的方法和属性,用来满足用户对文件的操作需求
1.fs.readFile(“路径”,“编码格式”,function(err,dataStr){}):用来读取指定文件中的内容
2.fs.wirteFile () : 用来向指定文件中写入内容
一、例整理成绩
const fs = require('fs')
fs.readFile("./files/成绩.txt",function(err,data){
if(err) console.log("读取失败"+ err);
// console.log("读取成功"+data);
// 1.先把成绩进行按照空格分割
let value = data.toString().split(" ")
// console.log(value);
// 2.循环分割后的数组,对每一项
const arrNew = []
value.forEach(element => {
arrNew.push(element.replace("=",":"))
});
// 3.将数组转化为字符串
const strnew = arrNew.join("\r\n")
// console.log(strnew);
// 调用fs.wirte()
fs.writeFile("./files/成绩-OK.txt",strnew,function(err,data){
if(err) console.log("填入失败"+ err);
console.log("填入成功");
})
})
path模块:用来处理路径的模块,提供了一系列的方法和属性,用来满足用户对路径的处理
const path = require("path")
const fs = require("fs")
// const pathStr = path.join("/a","/b/c","../","./d","e") //../会消除掉上一个字母\a\b\d\e
// console.log(pathStr);
// const pathStr2 = path.join(__dirname,"./files/1.txt") //_dirname当前文件所处的目录
// console.log(pathStr2);
fs.readFile(path.join(__dirname,"/files/成绩.txt"),function(err,dataStr){
if(err) return console.log(err.message);
console.log(dataStr.toString());
})
const path = require("path")
//设置存放路径
const fpath = "/a/b/c/index.html"
// 使用basepath将文件名提取出来
const fullname = path.basename(fpath)
console.log(fullname); //index.html
// 跟了第二个参数就会截取掉扩展名
const namewithoutExt = path.basename(fpath,".html")
console.log(namewithoutExt); //index
const path = require("path")
const fpath = "/a/b/c/index.html"
const fext = path.extname(fpath)
console.log(fext); //.html
综合时钟案例
回顾:
1.什么是客户端和服务端?
在网络节点中用来消费资源的电脑叫做客户端;用来对外提供网络资源的电脑叫做服务器
2.服务器和普通电脑的区别在于,服务器上安装了web服务器软件(IIS,Apache)这些软件将普通的电脑变成一台web服务器
3.IP地址
IP地址就是互联网上每一台计算机的唯一地址(相当于手机号码),只要在知道对方的IP地址的前提下,才能与对应的电脑之间进行数据通信
IP地址的格式为点分十进制(a,b,c,d)的形式。a,b,c,d都是0~255之间的十进制整数(互联网中的每台web服务器都有自己的IP地址)
在开发期间,自己的电脑即是一台服务器(127.0.0.1)也是一个客户端
4.域名和域名服务器
域名:IP地址的字符型地址方案(直观方便记忆)
域名服务器:域名和IP地址是一一对应的关系,这份对应关系存放在域名服务器中,使用者只需要通过几号的域名就可以访问对应的服务器,对应的转换工作由域名服务器来实现,因此,域名服务器就是提供IP地址和域名之间的转换服务的服务器
注意:
a.单纯有IP地址,互联网中的电脑也是可以正常工作的,但是有了域名的加持,能让互联网中的世界变得更加方便
b.127.0.0.1 对应的域名就是 localhost
5.端口号(相当于门牌号)
每个web服务都对应这唯一的端口号。客户端发送来的网络请求,通过端口号,可以被准确的给对应的web服务进行处理
每个端口号不能同时被多个web服务器占用,在实际应用中,URL中80端口可以被省略默认就是80
http模块:是node.js官方提供的,用来创建web服务器的模块。通过http模块提供的http.createServer()方法,就能方便的把一台普通的电脑,变成一台web服务器,从而对外提供web服务
基本使用
const express = require("express")
const app = express()
const mw = function(req,res,next){
console.log("这是一个中间件函数");
// 注意:在当中间件的业务逻辑处理完毕之后,必须调用next函数
// 表示把流转关系转交给下一个中间件或者路由
next()
}
const mw1 = function(req,res,next){
console.log("这是一个中间件函数");
// 注意:在当中间件的业务逻辑处理完毕之后,必须调用next函数
// 表示把流转关系转交给下一个中间件或者路由
next()
}
// 注册全局中间件
app.use(mw)
//局部中间件,只对这个路由起作用
app.get('/',mw1,(req,res)=>{
console.log("调用了这个路由");
res.send("home ape")
})
app.listen(80,()=>{
console.log("127.0.0.1");
})
全局中间件简化
// 注册全局中间件
app.use(function(req,res,next){
console.log("这是一个中间件函数");
// 注意:在当中间件的业务逻辑处理完毕之后,必须调用next函数
// 表示把流转关系转交给下一个中间件或者路由
next()
}
)
中间件的作用:
多个中间件之间共享同一份req和res基于这样的特性,可以在上游的中间件,统一为req和res对象添加和自定义属性和方法,供下游的中间件或者路由使用
中间件的使用注意事项:
中间件的分类:
1.应用级别的中间件
2.路由级别的中间件
3.错误级别的中间件(必须放在所有路由中间件之后)
专门用来捕获整个项目中发生的异常错误,从而防止项目异常崩溃的问题
// 注册全局中间件
app.use(function(err,req,res,next){
console.log("发生了错误"+err.message); //在服务器打印错误的信息
// 向客户端发送错误信息
res.send("Error"+err.message)
})
app.use(express.json())
app.use(express.urllencoded({extended:false})
app.use(express.json())
app.use(express.urlencoded({extended:false}))
app.get('/',(req,res)=>{
console.log(req.body);//如果没有废纸任何解析表单数据的中间件,req.body默认等于undefined
res.send("ok")
})
app.post('/',(req,res)=>{
console.log(req.body);
res.send('ok')
})
扩展:express内置的express.urllencoded 中间件,就是基于body-parsr这个第三方中间件进一步封装出来的
监听req对象的data事件,获取客户端发送到服务器的数据,如果数据量比较庞大,把数据切割之后,分批发送到服务器,需要手动对数据进行拼接
// 4.将字符串格式的请求体数据解析为对象格式,使用内置模块querystring