Node.js常用知识
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.exists
if(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)
//获取请求的URl
console.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) //获取url
let pathname=res.pathname //获取url的名称
let keyword=res.query.keyword; //获取url的keyword
console.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、模版引擎
模版引擎是分离用户界面和业务数据的一种技术