Nodejs
总结Node.js基础知识,便于定期回顾
1、fs
文件写入
1、require(‘fs’)
2、fs.writeFile()
3、fs.appendFile()
4、fs.createwriteStream() //流式写入
ws.write()
文件读取
1、fs.readFile(‘’,(err,data)=>{
})
const fs=require('fs')
fs.readFile("D:/Node/Data.txt",(err,data)=>{console.log(data.toString())
})
2、流式读取
const rs=fs.createReadStream('./观书有感.txt')
rs.on('data',chunk=>{console.log(chunk)
})
rs.on('end',()=>{console.log("读取完成");
})
3、边取边存。
const fs=require('fs');const rs=fs.createReadStream('./观书有感.txt');
const ws=fs.createWriteStream('./观书有感2.txt');rs.on('data',chunk=>{ws.write(chunk);
})rs.on('end',()=>{console.log('执行完成')
})
也可以
rs.pipe(ws)
3、内存占用大小
console.log(process.memoryUsage)
4、文件重命名和移动
fs.rename('./座右铭.txt','./论语.txt',err=>{console.log(完成);
});
5、删除文件
//方法一:使用异步回调方法 fs.unlink()
const fs = require('fs');fs.unlink('./观书有感2.txt', (err) => {if (err) {console.error("文件删除失败:", err);return;}console.log("文件删除成功");
});
//方法二:使用同步方法 fs.unlinkSync()
const fs = require('fs');try {fs.unlinkSync('./观书有感2.txt');console.log("文件删除成功");
} catch (err) {console.error("文件删除失败:", err);
}
6、创建对象
const fs=require('fs');
fs.mkdir('./html',err=>{console.log("创建成功");
});
7、递归创建文件
fs.mkdir('./A/B/C',{recursive:true},err=>{console.log("创建成功");
})//删除文件
fs.rm('./')
8、读取文件夹
fs.readdir('./A',(eer,data)=>{if(eer){console.log("读取失败");return;}console.log(data);
});
9、删除文件夹
//递归删除
fs.rmdir('./A',{recursive:true},err=>{})//建议使用
fs.rm('./A',{recursive:true},err=>{})
10、查看资源状态
fs.stat('./A',(err,data)=>{ //旧方法fs.existsif(err){console.log('操作失败')return;}console.log(data)
})
11、__dirname
绝对路径 ’全局变量‘ 保存的是所在文件的所在目录的绝对路径。
fs.writeFile(__dirname+'/index.html')
12、Path
const path=require('path')
console.log(path.resolve(__dirname,'./index.html')); //该方法将一些的 路径/路径段 解析为绝对路径
console.log(__filename) //打印文件的绝对路径;
path.parse(str) //解析路径并返回对象
path.basename() 获取路径的基础名称
path.dirname() 获取路径的目录名
path.extname() 获取路径的扩展名
2、HTTP
1、响应状态码
200 请求成功
403 禁止请求
404 找不到资源
500 服务器内部错误
1xx 信息响应
2xx 成功响应
3xx 重定向消息
4xx 客户端错误响应
5xx 服务端错误响应
2、本地回环
127.0.0.1
3、Http协议默认端口是80,HTTPS协议默认端口是443,HTTP服务开发常用端口有3000,8080,8090,9000
4、获取请求HTTP报文
const http=require('http')
const server=http.createServer((request,response)=>{response.setHeader('content-type','text/html;charset=utf-8');//获取请求的方法console.log(request.method)//获取请求的URlconsole.log(request.url)//只包含url中的路径与查询字符串//获取http协议版本号console.log(request.httpVersion);//获取请求头console.log(request.headers)response.end('你好');
})
server.listen(9000,()=>{console.log("服务已经启动...");
})
res.writeHead(200, { ‘Content-type’: ‘text/html;charset=utf-8’ })
response.setHeader(‘content-type’,‘text/html;charset=utf-8’);
express框架中用req.body接收post客户端的数据,req.query接收get请求
http中
req.setEncoding('utf-8');
req.on('data',function(data){console.log(data)
})
req.on('end')
5、获取Http报文中的URL路径与查询字符串
const http=require('http')
const url=require('url');
const server=http.createServer((request,response)=>{let res=url.parse(request.url,true) //获取urllet pathname=res.pathname //获取url的名称let keyword=res.query.keyword; //获取url的keywordconsole.log(keyword)response.end('url')
})
server.listen(9000,()=>{console.log("服务已经启动...");
})
推荐使用的方法
const http=require('http')
const server=http.createServer((request,response)=>{//实例化URL的对象let url=new URL(request.url,'http://127.0.0.1');//输出路径console.log(url.pathname);//输出keyword查询字符串console.log(url.searchParams.get('keyword'));response.end('url');
})
server.listen(9000,()=>{console.log("服务已经启动...");
})
6、练习 request
const http=require('http')
const server=http.createServer((request,response)=>{response.setHeader('content-type','text/html;charset=utf-8')let {method}=request;let {pathname}=new URL(request.url,'http://127.0.0.1')console.log(method);console.log(pathname);if(method=='GET'&&pathname=='/login'){response.end("登陆页面")}else if(method=='GET'&&pathname=='/reg'){response.end('注册页面')}else{response.end('啥也没有')}
})
server.listen(9000,()=>{console.log("服务已经启动")
})
7、练习、response
response.end 有且只有一个,可以使用response.write写很多内容
8、读取html
const http=require('http')
const fs=require('fs')
const server=http.createServer((request,response)=>{response.setHeader('content-type','text/html;charset=utf-8');let html=fs.readFileSync('./test.html');response.end(html)
});
server.listen(9000,()=>{console.log('服务器启动')
})
9、读取css
const http = require('http')
const fs = require('fs')
const server = http.createServer((request, response) => {//response.setHeader('content-type', 'text/html;charset=utf-8');let {pathname}=new URL(request.url,'http://127.0.0.1');if(pathname=='/'){console.log(pathname)let html = fs.readFileSync(__dirname+'/test.html');response.end(html)}else if(pathname=='/table.css'){console.log(pathname)let css = fs.readFileSync(__dirname+'/table.css');response.end(css)}else{response.statusCode=404;response.end(`<h1>404 not found</h1>`)}});
server.listen(9000, () => {console.log('服务器启动')
})
10、静态文件搭建
const http = require('http')
const fs = require('fs')
const server = http.createServer((request, response) => {//response.setHeader('content-type', 'text/html;charset=utf-8');let {pathname}=new URL(request.url,'http://127.0.0.1');let filepath=__dirname+pathname;fs.readFile(filepath,(err,data)=>{if(err){response.statusCode=500;response.end('文件读取是被~~');return;}response.end(data)})});
server.listen(9000, () => {console.log('服务器启动')
})
10、mime 媒体类型
加不加都可以,加上更规范
let mimes={html:'text/html',css:'text/css',js:'text/javascripts',png:'image/png',jpg:'image/jpeg',gif:'image/gif',mp4:'video/mp4',mp3:'audio/mpeg',json:'application/json'
}
fs.readFile(filepath,(err,data)=>{if(err){response.statusCode=500;response.end('文件读取是被~~');return;}//获取文件的后缀名let ext=path.extname(filepath);let type=mimes[ext]if(type){response.setHeader('content-type',type+';charset=utf-8') //同时解决乱码问题}else{response.setHeader('content-type','application/octet-stream');}///响应文件内容response.end(data)})
3、模块化
1、暴露数据
function tiemo(){console.log('贴膜...');
}
function Fun(){console.log('yes...');
}
//暴露数据方法一
//exports.tiemo=tiemo;
//exports.Fun=Fun;
//module.exports可以暴露任何值
module.exports={tiemo,Fun
}///获取数据//导入模块
const ms=require('./me.js');
ms.tiemo();
ms.Fun();
2、package.json
{"main":"./app.js"
}const me=require('./mode') //mode是一个文件夹 package.json在文件夹下面
console.log(me)
如果package.json不存在,则会尝试导入文件夹下的index.js和index.json
4、包管理工具
1、npm初始化
npm init
2、npm资源网址
npm (npmjs.com)
3、生产依赖和开发依赖
npm i -S uniq ------npm i --save uniq 生产
npm i -D less ------npm i --save-dev less 开发
4、全局安装包的位置
使用 npm root -g 查看
5、npm i
刚拉下来的项目是不能启动的,首先需要npm i一下
6、删除包
npm r 包名
7、配置别名
{"name": "test","version": "1.0.0","description": "学习npm","main": "index.js","scripts": {"test": "echo \"Error: no test specified\" && exit 1","server":"node ./Npms/.index.js" ================在这个位置"start": "node ./Npms/index.js",},"author": "","license": "ISC"
}
后面运行的话,使用npm run server
如果是start,使用npm start。
8、cnpm
npmmirror 镜像站
9、配置npm淘宝镜像
1、安装nrm
npm i -g nrm
2、修改镜像
nrm use taobao
3、检查是否配置成功
npm config list
nrm ls 可以列出支持的镜像地址
10 、yarn
安装
npm i -g yarn
配置镜像
11、报错
如果在运行期间,报错 (因为在此系统上禁止运行脚本)。
解决方法:管理员打开powershell ,运行set-ExecutionPolicy RemoteSigned 点击Y确认。
这是更改计算机的执行策略。
12、 查看配置
yarn config list
13、包管理工具不能混用
14、如果想发布包的话
要用 nrm use npm 修改回来镜像
11、NVM
可以很方便的帮我们切换nodejs版本
5、Express
npm install express
初体验
//1、导入express
const express=require('express')//2.创建应用对象
const app=express()//3、创建路由
app.get('/home',(req,res)=>{res.end('hello express')
})
//4、监听端口,启动服务
app.listen(3000,()=>{console.log('服务已经启动,端口3000正在监听')
})
app.post('/login',(req,res)=>{res.end('Post')
})
app.all('/test',(req,res)=>{console.log("执行")res.end('执行')
})
//最后找不到 就执行这个
app.all('*',(req,res)=>{console.log("执行")res.end('执行')
})
app.get('/request',(req,res)=>{console.log(req.httpVersion);console.log(req.method)console.log(req.headers);console.log(req.url)console.log(req.path)console.log(req.query)console.log(req.ip)//获取请求头console.log(req.get('host'))res.end('hello express')
})
2、路由参数获取
app.get('/:id.html',(req,res)=>{console.log(req.params.id) //params相当于所有参数res.end("shang pin lie biao")
})
3、express 对于json的读取
//1、导入express
const express=require('express')
const {singers}=require('./singer.json') //使用解构赋值可以使导出的js变成一个对象,而不是数组。
//2.创建应用对象
const app=express()
console.log(singers)
app.get('/request',(req,res)=>{console.log(req.httpVersion);console.log(req.method)console.log(req.headers);console.log(req.url)console.log(req.path)console.log(req.query)console.log(req.ip)//获取请求头console.log(req.get('host'))res.end('hello express')
})app.get('/ .html',(req,res)=>{let {id}=req.params;let result =singers.find(item=>{if(item.id===Number(id)){return true;}});console.log(result)
})//4、监听端口,启动服务
app.listen(3000,()=>{console.log('服务已经启动,端口3000正在监听')
})
4、一般响应设置
//原生响应res.statusCode=404;res.statusMessage='love';res.setHeader('xxx','yyy')res.write('hello express') //的返回数据是没有经过处理的,原封不动的返回原数据,所见即所得.与res.end成对出现。//可以执行多次res.end('response') //不允许多次输入//express响应res.status(500);res.set('aaa','bbb');res.send('你好')res.status(500).set('abc','def').send('thisisok')
5、
app.get('/home',(req,res)=>{//跳转响应 重定向//res.redirect('https://www.baidu.com/')//下载响应//res.download(__dirname+'/singer.json');//Json响应res.json({name:'ok',slogin:'YuYu'})//响应文件内容res.sendFile(__dirname+'/test.html');
})
6、中间件的使用
const express=require('express');
const fs=require('fs')
const app=express();
const path=require('path')
function Midd(req,res,next){let {url,ip}=req;fs.appendFileSync(path.resolve(__dirname,'./access.log'),`${url} ${ip}\r\n`)next();
}
app.use(Midd) //这种是作用全局
app.get('/home',(req,res)=>{res.send("前台首页")
})
app.get('login',(req,res)=>{res.send("后台首页")
})
第二种 类似于局部使用
const { application } = require('express');
const express=require('express')
const app=express();
app.get('/home',(req,res)=>{res.send('首页')
})
function Mindd(req,res,next){if(req.query.code==='521'){next()}else{res.send('code有问题')}
}
app.get('/admin',Mindd,(req,res)=>{res.send('登陆界面')
})
app.get('/setting',Mindd,(req,res)=>{res.send('设置界面')
})
app.listen(3000,()=>{console.log('服务器监听中。')
})
7、静态资源中间件
//静态资源中间件设置
app.use(express.static(__dirname+'/public'))
问题 路由和静态资源的优先问题
当app.get(‘/’)时,直接http://127.0.0.1:3000/可以访问,也可以访问index.html, 他俩的优先级是啥。
按照自上而下的顺序。
路由响应动态资源,静态资源中间件响应静态资源。
8、请求体
const express=require('express');
const bodyParser = require('body-parser')
const app=express();
// create application/json parser
//const jsonParser = bodyParser.json()// create application/x-www-form-urlencoded parser
const urlencodedParser = bodyParser.urlencoded({ extended: false })app.get('/login',(req,res)=>{res.sendFile(__dirname+'/form.html')
})
app.post('/login',urlencodedParser,(req,res)=>{console.log(req.body)res.send('获取用户的数据')
})
app.listen(3000,()=>{console.log('服务器运行中...')
})
9、防盗链
防止外部网站盗用本网站内容
const express=require('express')const app=express();app.use((req,res,next)=>{let referer=req.get('referer');if(referer){let url=new URL(referer);let hostname=url.hostname;if(hostname!=='127.0.0.1'){res.status(404).send('<h1>404 Not Found</h1>')return;}}next();
})app.use(express.static(__dirname+'/public'));app.listen(3000,()=>{console.log("服务器已经启动,端口3000.。。")
})
10、路由的模块化
const express = require('express')
const adminRouter=require('./routes/adminRouter');
const loginRouter=require('./routes/loginRouter')
const app = express();
//设置
app.use(adminRouter);
app.use(loginRouter);
app.listen(3000, () => {console.log("服务器执行。。。。")
})
---------------------------------------------------
const express =require('express');
const router=express.Router();
router.get('/login', (req, res) => {console.log('login执行')res.send('login执行');
})
module.exports=router;
11、模版引擎
模版引擎是分离用户界面和业务数据的一种技术