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.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、模版引擎

模版引擎是分离用户界面和业务数据的一种技术

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/68844.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C#属性和字段(访问修饰符)

不同点逻辑性/灵活性存储性访问性使用范围安全性属性(Property)源于字段,对字段的扩展,逻辑字段并不占用实际的内存可以被其他类访问对接收的数据范围做限定,外部使用增加了数据的安全性字段(Field)不经过逻辑处理占用内存的空间及位置大部分字段不能直接被访问内存使用不安全 …

15JavaWeb——Maven高级篇

Maven高级 Web开发讲解完毕之后&#xff0c;我们再来学习Maven高级。其实在前面的课程当中&#xff0c;我们已经学习了Maven。 我们讲到 Maven 是一款构建和管理 Java 项目的工具。经过前面 10 多天 web 开发的学习&#xff0c;相信大家对于 Maven 这款工具的基本使用应该没什…

100.1 AI量化面试题:解释夏普比率(Sharpe Ratio)的计算方法及其在投资组合管理中的应用,并说明其局限性

目录 0. 承前1. 夏普比率的基本概念1.1 定义与计算方法1.2 实际计算示例 2. 在投资组合管理中的应用2.1 投资组合选择2.2 投资组合优化 3. 夏普比率的局限性3.1 统计假设的限制3.2 实践中的问题 4. 改进方案4.1 替代指标4.2 实践建议 5. 回答话术 0. 承前 如果想更加全面清晰地…

从0开始使用面对对象C语言搭建一个基于OLED的图形显示框架(基础图形库实现)

目录 基础图形库的抽象 抽象图形 抽象点 设计我们的抽象 实现我们的抽象 测试 抽象线 设计我们的抽象 实现我们的抽象 绘制垂直的和水平的线 使用Bresenham算法完成任意斜率的绘制 绘制三角形和矩形 矩形 三角形 实现 绘制圆&#xff0c;圆弧和椭圆 继续我们的…

文件系统分析

文件系统与磁盘管理详解 一、存储设备基础 1. 存储设备类型对比 设备类型特点典型接口应用场景机械硬盘依赖磁头机械读写&#xff0c;转速影响性能&#xff08;5400/7200/10000rpm&#xff09;&#xff0c;价格低容量大SATA/SAS冷数据存储、备份固态硬盘无机械结构&#xff…

基于Python的药物相互作用预测模型AI构建与优化(上.文字部分)

一、引言 1.1 研究背景与意义 在临床用药过程中,药物相互作用(Drug - Drug Interaction, DDI)是一个不可忽视的重要问题。当患者同时服用两种或两种以上药物时,药物之间可能会发生相互作用,从而改变药物的疗效、增加不良反应的发生风险,甚至危及患者的生命安全。例如,…

1.Template Method 模式

模式定义 定义一个操作中的算法的骨架&#xff08;稳定&#xff09;&#xff0c;而将一些步骤延迟&#xff08;变化)到子类中。Template Method 使得子类可以不改变&#xff08;复用&#xff09;一个算法的结构即可重定义&#xff08;override 重写&#xff09;该算法的某些特…

16.[前端开发]Day16-HTML+CSS阶段练习(网易云音乐五)

完整代码 网易云-main-left-rank&#xff08;排行榜&#xff09; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name&q…

使用Pygame制作“走迷宫”游戏

1. 前言 迷宫游戏是最经典的 2D 游戏类型之一&#xff1a;在一个由墙壁和通道构成的地图里&#xff0c;玩家需要绕过障碍、寻找通路&#xff0c;最终抵达出口。它不但简单易实现&#xff0c;又兼具可玩性&#xff0c;还能在此基础上添加怪物、道具、机关等元素。本篇文章将展示…

Python之Excel操作 - 写入数据

我们将使用 openpyxl 库&#xff0c;它是一个功能强大且易于使用的库&#xff0c;专门用于处理 Excel 文件。 1. 安装 openpyxl 首先&#xff0c;你需要安装 openpyxl 库。你可以使用 pip 命令进行安装&#xff1a; pip install openpyxl创建一个文件 example.xlsx&#xff…

C++解决输入空格字符串的三种方法

一.gets和fgets char * gets ( char * str ); char * fgets ( char * str, int num, FILE * stream ); 1. gets 是从第⼀个字符开始读取&#xff0c;⼀直读取到 \n 停⽌&#xff0c;但是不会读取 \n &#xff0c;也就是读取到的内容 中没有包含 \n ,但是会在读取到的内…

99.20 金融难点通俗解释:中药配方比喻马科维茨资产组合模型(MPT)

目录 0. 承前1. 核心知识点拆解2. 中药搭配比喻方案分析2.1 比喻的合理性 3. 通俗易懂的解释3.1 以中药房为例3.2 配方原理 4. 实际应用举例4.1 基础配方示例4.2 效果说明 5. 注意事项5.1 个性化配置5.2 定期调整 6. 总结7. 代码实现 0. 承前 本文主旨&#xff1a; 本文通过中…

pandas中的apply方法使用

apply 用于对 DataFrame 或 Series 中的数据进行逐行或逐列的操作。它可以接受一个函数&#xff08;通常是 lambda 函数或自定义函数&#xff09;&#xff0c;并将该函数应用到每一行或每一列上。apply语法&#xff1a; DataFrame.apply(func, axis0, rawFalse, result_typeNo…

Spring Boot + Facade Pattern : 通过统一接口简化多模块业务

文章目录 Pre概述在编程中&#xff0c;外观模式是如何工作的&#xff1f;外观设计模式 UML 类图外观类和子系统的关系优点案例外观模式在复杂业务中的应用实战运用1. 项目搭建与基础配置2. 构建子系统组件航班服务酒店服务旅游套餐服务 3. 创建外观类4. 在 Controller 中使用外…

【JavaEE进阶】应用分层

目录 &#x1f38b;序言 &#x1f343;什么是应用分层 &#x1f38d;为什么需要应用分层 &#x1f340;如何分层(三层架构) &#x1f384;MVC和三层架构的区别和联系 &#x1f333;什么是高内聚低耦合 &#x1f38b;序言 通过上⾯的练习,我们学习了SpringMVC简单功能的开…

openeuler 22.03 lts sp4 使用 cri-o 和 静态 pod 的方式部署 k8s-v1.32.0 高可用集群

前情提要 整篇文章会非常的长…可以选择性阅读,另外,这篇文章是自己学习使用的,用于生产,还请三思和斟酌 静态 pod 的部署方式和二进制部署的方式是差不多的,区别在于 master 组件的管理方式是 kubectl 还是 systemctl有 kubeadm 工具,为什么还要用静态 pod 的方式部署?…

docker安装nacos2.2.4详解(含:nacos容器启动参数、环境变量、常见问题整理)

一、镜像下载 1、在线下载 在一台能连外网的linux上执行docker镜像拉取命令 docker pull nacos:2.2.4 2、离线包下载 两种方式&#xff1a; 方式一&#xff1a; -&#xff09;在一台能连外网的linux上安装docker执行第一步的命令下载镜像 -&#xff09;导出 # 导出镜像到…

Kubernetes组成及常用命令

Pods(k8s最小操作单元)ReplicaSet & Label(k8s副本集和标签)Deployments(声明式配置)Services(服务)k8s常用命令Kubernetes(简称K8s)是一个开源的容器编排系统,用于自动化应用程序的部署、扩展和管理。自2014年发布以来,K8s迅速成为容器编排领域的行业标准,被…

什么是门控循环单元?

一、概念 门控循环单元&#xff08;Gated Recurrent Unit&#xff0c;GRU&#xff09;是一种改进的循环神经网络&#xff08;RNN&#xff09;&#xff0c;由Cho等人在2014年提出。GRU是LSTM的简化版本&#xff0c;通过减少门的数量和简化结构&#xff0c;保留了LSTM的长时间依赖…

Hot100之哈希

1两数之和 题目 思路解析 解法1--两次循环 解法2--哈希表一次循环 代码 解法1--两次循环 class Solution {public int[] twoSum(int[] nums, int target) {int nums1[] new int[2];int length nums.length;for (int i 0; i < length; i) {for (int j i 1; j < …