一·node
1·1:什么是node
node是一个基于chromeV8引擎的javascript的服务器端运行环境 让javascript的触角深入到服务器端,即就是js语言可以独立于浏览器进行运行
1·2:node的优缺点:
通过这三点优势突出了node的 快
- 单线程:高并发使得node让cpu的利用率可以达到100%
- 非阻塞式i/o 就是node在访问高io(输入输出)的应用的时候 不会等待着它的完
- 事件驱动 把高io的操作放到一个事件列队当中 完成后通过回调函数的方式在进入到线程里 事件环
所以node一般适合开发高并发的,高i/o的
不适合开发一些对稳定性要求较高的应用【银行,医院,电力等】
二:node的使用:
2·1:REPL交互性解释器
可以让我们在终端CMD输入命令 node来解析js,让js脱离浏览器单独运行
打开cmd 在电脑上安装了node的情况下 输入node 回车 就可以单独的运行js了
2·2:node 如何运行js文件
2·2·1:魔术变量
-
_ _filename 查看当前运行文件的文件的绝对路径
-
_ _dirname 查看当前运行文件的文件夹的绝对路径
第一: cd到要运行的文件的文件夹中
第二:使用 node空格文件名来进行运行
2·3:模块
2·3·1:模块化的区分
模块主要分为commonjs模块化和es6的模块化
-
commonjs的模块化
引入: require()
引出: module.exports / exports
-
ES6的模块化
引入:import from
引出:export/ export default
2·3·2:为什么要写模块?
js有作用域问题 变量和方法只能在当前的这个文件中进行使用 所以如果想复用的话我们就必须要使用模块
2·3·3:模块的优势?
少了代码的重复,提高了复用率
划分功能 方便管理
方便使用第三方模块
三:node的内置模块
3·1:fs模块:
文件系统模块 对电脑上的系统文件或者目录进行读写操作
3·2:目录
3·2·1读取目录
-
同步读取:readdirSync()
同步代码 在遇见错误的时候错误代码后面的内容就不会继续运行了
那么我就是想让错误的内容后面的继续运行怎么办?使用 错误捕获 try catch
let fs=require("fs") try { // 可能会错的代码 let dirs=fs.readdirSync("./") console.log(dirs) } catch (error) { // 错了之后怎么办? console.log("俨然已经错了") }
-
异步读取:readdir()
fs.readdir(你要读取的路径,可选参数,回调函数)
异步操作有一个错误优先原则
let fs=require("fs") fs.readdir("./",(err,ok)=>{ if(err){ console.log("读取错啦") }else{ console.log(ok) } })
//使用promise封装 let fs=require("fs") function rd(){ return new Promise((resolve,reject)=>{ fs.readdir("./",(err,ok)=>{ // 异步操作有一个错误优先原则 // 如果没有错误就是null if(err){ reject("读取错啦") }else{ resolve(ok) } }) }) } rd().then((ok)=>{ console.log(ok) }).catch((err)=>{ console.log(err) })
3·2·2:创建目录
-
mkdir()异步创建
-
mkdirSync() 同步创建
3·2·3:改名字
rename(你要改那个的路径,改成什么,回调)
let fs=require("fs")
fs.rename("./bb","cc",(err,ok)=>{
if(err){
console.log("错啦")
}else{
console.log("成功!!!!")
}
})
3·2·4:删除目录
rmdir()
删除目录只能删除空文件夹
let fs=require("fs")
fs.rmdir("./aa",(err,ok)=>{
if(err){
console.log("没有删除成功")
}else{
console.log("删除成功了")
}
})
3·3:文件
3·3·1:写入writeFile()
3·3·2:读取readFile()
3·3·3:删除unlink()
let fs=require("fs")
fs.unlink("./cc/小明.html",(err,ok)=>{
if(err){
console.log("删除失败")
}else{
console.log("删除成功!!!!")
}
})
四:回调地狱
4·1:什么是回调地狱?
回调函数层层的嵌套 因为node是非阻塞io 就是node中经常有回调地狱
4·2:解决方式:
promise asyc/awiat 蓝鸟插件
4·3:promise
promise对象是一个容器,在它里面保存的就是一些以后未来才会完成的内容 (通常是一些异步操作)promise就可以吧异步操作以同步的方式展示出来 就避免了回调函数层层嵌套 让我们的使用更加方便
// let fs=require("fs")
// fs.readdir("./",(err,ok)=>{
// // 异步操作有一个错误优先原则
// // 如果没有错误就是null
// if(err){
// console.log("读取错啦")
// }else{
// console.log(ok)
// }
// })
let fs=require("fs")
function rd(){
return new Promise((resolve,reject)=>{
fs.readdir("./",(err,ok)=>{
// 异步操作有一个错误优先原则
if(err){
reject("读取错啦")
}else{
resolve(ok)
}
})
})
}
rd().then((ok)=>{
console.log(ok)
}).catch((err)=>{
console.log(err)
})
五:HTTP模块
http模块是node中核心模块 创建服务器
createServer() 创建服务器
let http=require("http")
// 2.创建服务
// 形参:req:请求, res:响应
http.createServer((req,res)=>{
// 返回响应头
res.writeHead(200,{"Content-type":"text/html;charset=UTF-8"})
// 设置返回内容
res.end("我是一个服务器")
}).listen(3000)
六:express
express是一个灵活的nodejs的应用框架 它里面提供了大量的丰富的http工具
-
npm下载
-
创建基本的服务
let express=require("express") let app=express() // 创建服务 app.get("/hhhh",(req,res)=>{ res.send({msg:"我是第一个接口"}) }) // 端口 app.listen(3030)
6·1:express 路由与中间件
中间件:app.use(“地址”,方法)
无论你要进入那个位置的时候都会先经过我
路由 就是根据url的不同与相应不同的请求
index.js
let express=require("express")
let app=express()
// 引用路由文件
let r1=require("./routers/1.js")
let r2=require("./routers/2.js")
// 分发路由
app.use("/index",r1)
app.use("/login",r2)
// 端口
app.listen(3000)
routers文件夹下的1.js
let express = require("express")
// 调用路由
let router = express.Router()
// 设置路由
router.get("/room", (res, req) => {
res.send("首页的数据")
})
module.exports = router
routers文件夹下的2.js
let express = require("express")
// 调用路由
let router = express.Router()
// 设置路由
router.get("/login", (res, req) => {
res.send("登录的数据")
})
module.exports = router
/ 调用路由
let router = express.Router()
// 设置路由
router.get("/room", (res, req) => {
res.send("首页的数据")
})
module.exports = router
routers文件夹下的2.js
let express = require("express")
// 调用路由
let router = express.Router()
// 设置路由
router.get("/login", (res, req) => {
res.send("登录的数据")
})
module.exports = router