nodejs介绍

nodejs官网支持的各种库api
https://nodejs.org/docs/latest-v21.x/api/http.html
nodejs包括vp8引擎和内置的基本库如fs,path,http,querystring等,也可以用npm按转第三方库
npm是nodejs环境的包管理工具,可以为这个环境安装卸载各种包。
npm install pkg
npm uninstall pkg
安装包时会报缺少一个package.json,此时执行npm init就会自动创建,它用来记录这个环境里安装了什么包,这样移植环境时只需要执行npm install或者npm i就可以按着这个文件下载需要的包了。

编写.js文件,用node file.js即可运行
fs文件系统的使用

const fs = require('fs')
//读文件
fs.readFile('./file.txt', 'utf8', function(err, dataStr)){
console.log(err)
console.log('-----')
console.log(dataStr)
console.log('hello world!')
//写文件
fs.writeFile('./file.txt', 'abcd', function(err){
    if(err){
        return console.log('文件写入失败' + err.message)
    }
    console.log(err)
})

path路径的处理

const path = require('path')
const pathStr = path.join('/a', 'b/c', '../', './d', 'e');
console.log(pathStr)// /a/b/d/e

在浏览器访问80端口的服务器时可以省略端口号,因为80是默认的。浏览器只能发起Get请求

IIS和Apache(php开发人员使用)都是web服务器,而nodejs通过其提供的http模块,几行代码就能实现一个服务器。
nodejs创建web服务器步骤
1.导入http模块
2.创建web服务器实例
3.为服务器实例绑定request事件,监听客户端请求
4.启动服务器

const http = require('http')
const server = http.createServer();
//只要被访问就会触发request监听

req对象包括了来访问的客户端的信息,如url代表起访问的目录,method代表了访问的方法如Post或Get。
比如访问127.0.0.1:8080/index.html,那么url就是/index.html,如果访问127.0.0.1:8080,那么默认访问的/目录
server.on('request', function(req, res)
{
console.log('Someone vi@feature:terminalsit our web server.')
})
server,listen(8080, function(){
console.log('server running at http://127.0.0.1:8080')
}

res对象表示返回给客户端的信息

server.on('request', (req, res) => {
    const url = req.url
    const method = req.method
    // const str = 'Your request url is ${url}, and request method is ${method}'
    console.log('Your request url is ' + url + ' method is ' + method)
    
    const ch_str = '您请求的是进击的巨人!'
    //如果不添加的话,浏览器访问中文会乱码,这两个参数是固定的
    res.setHeader('Content-Type', 'text/html; charset=utf-8')
    res.end(ch_str)//返回给客户端,并结束响应
})

node.js模块分类
内置模块(如http),自定义模块(用户创建的每个.js文件都是自定义的)
第三方模块,第三方开发,需要先下载才能使用
用require(),加载以上模块
require(‘http’)//
require(‘./test.js’)//自定义模块需要加路径
require(‘moment’)//第三方
require()加载其他模块时,会执行这个模块的代码

模块作用域:只能在当前模块访问的变量和方法,叫做模块作用域,模块默认都是有模块作用域的。

在每个.js自定模块中都有一个module对象,它里面存储了当前模块的有关信息。
在定义模块中,可以用module.exports来把模块贡献出去,默认module.exports的名字为空
const age = 20
module.exports.username = ‘zs’
module.exports.sayHello = function(){}
module.exports.age = age //向外暴露

module.exports比较复杂,exports代表他的简写版本。
require()获取到的地向永远都是module.exports指向的对象,如果没有它的话,那么就导入exports指向的对象。如果两个都设置了,有冲突以moduel.exports为主,没有则合并。
node.js遵循CommonJS模块化规范:
1.每个模块内部,module变量代表当前模块。
2.module变量是一个对象,他的exports属性时对外的接口
3.加载莫个模块,其实就是加载module.exports属性。用require()属性。
npm公司提供了公共的包开发和下载网站,在这个网站可以搜到包,且查看包的api用法,下载命令
https://www.npmjs.com/,并且提供了一个服务器专门去下载包,https://registry.npmjs.org/在这个服务器下载包

npm用@安装指定版本的包
npm i moment@2.22.2
如果已经安装了其他版本不用卸载,会覆盖之前的版本。
npm规定,在项目根目录,必须提供一个package.json的包管理配置文件,用来记录跟项目有关的信息,如:
1.项目的名称,版本号
2.项目用了哪些包
3.哪些包只会开发期间用到
4.哪些包在开发和部署时都需要用到
初次安装包后,会自动创建一个node_modules文件夹,在这个文件夹里还有package-lock.json配置文件。
node_modules是用来存放下载的包的,每个包单独一个文件夹。
package-lock.json用来记录每个包的下载信息,名字,版本号,和下载地址。

快速创建package.json,用下命令
npm init -y
上述命令只能在英文目录下运行,不能在中文下,且英文间不能有空格。
npm install命令安装包时,mpm会自动把包的名称和版本号记录到package.json中的"dependencies"节点,如果没有这个节点会自动创建。
运行npm install会读取package.json中的"dependencies"节点,然后一次性全部下载。
运行以下命令,来卸载指定的包
npm uninstall moment
它会自动去"dependencies"节点去把这个包删除。
devDependencies节点用来记录只在开发阶段使用的包,在项目上线后不会使用的包。"dependencies"节点记录上线会使用的包。
npm i 包名 -D
以上命令指定下载的包记录在devDependencies节点,它等价于以下写法
npm install 包名 --save-dev
如何判断这个包放在哪个节点,可以去官网搜这个包,会有它的安装命令来判断。
使用npm下包时,其实是从官方服务器下载数据,每个数据都要经过海底光缆,因此可以切换为淘宝源。
npm config get registry //查看当前源 默认官方源
npm config set registry=https://registry.npm.taobao.org

nrm切换和查看镜像源的工具
npm i nrm -g //-g 安装全局
nrm ls //列出了当前可用源
nrm use tabao //切换

卸载全局包
npm uninstall 包名 -g
哪些包需要全局安装呢,可以去官方搜一下。只有工具性质的包,才有全局的必要性,它会提供终端命令供使用。
i5ting_toc这个包可以把.md转换为.html
npm i -g i5ting_toc
i5ting_toc -f .md -o .html

package.json必须包含,包名,版本和main,其中main代表着包的入口文件

发布包,需要在官网申请账号https://www.npmjs.com/,然后终端执行
npm login
但需要先把npm源切换到官方源
npm publish
删除已经发布的包
npm unpublish //只能删除72小时以内发布的包

模块的加载机制
加载后的模块会缓存,多次require()并不会重复加载。
内置模块的加载优先级最高
加载自定义模块时必须指定./或者…/开头,不然nodejs会把它当内置模块或者第三方模块加载。
如果没有写扩展名,node做法:
1.按照确切的文件名进行加载
2.补全.js再加载
3.补全.json再加载

Express是对http进行封装的第三方包,用它来作web服务器和api接口服务器比http更加简洁好用。
安装
npm i express@4.17.1
创建web服务器

const express = require('express')
const app = express()
app.get('/user', (req, res)=>{
    res.send({name:'25', age:20, gender:'男'})
})
app.post('/user', (req, res)=>{
    res.send('请求成功')
}) 
//通过req.params对象获取动态参数
// postman的url为http://127.0.0.1:8089/user/2
//其实就是url不用写key值了,key值在服务器里固定了
app.get('/user/:id', (req, res)=>{
    console.log(req.params) //req.query()默认是空
    res.send(req.params)
})
//打印和postman得到的值
// {
//     "id": "2"
// }
app.listen(8088, ()=>{
    console.log('express server running at http://127.0.0.1')
})
//将当前clock文件夹下的目录暴露给客户端
//当暴露多个文件时,会按暴露的顺序依次去目录里查找
//https://127.0.0.1:8089/index.html  index.html为html目录下的文件,以本文件为相对目录
// app.use(express.static('./html'))

//此时访问url必须是https://127.0.0.1:8089/abc/index.html 这是伪装,防止别人知道自己的真实路径
app.use('/abc',express.static('./html'))

//每次修改.js文件,都需要关闭,然后重启,nodemon可以检测.js文件的修改,自动重启
npm install -g nodemon
使用,当修改的文件保存后就会自动重启
nodemon index.js

路由匹配,先匹配方法,再匹配路径,成功就会调用函数。按注册顺序,首先匹配成功就调用,然后不会再匹配了。

app.post('/user', (req, res)=>{
     res.send('请求成功')
 })
 app.post('/user', (req, res)=>{
     res.send('请求成功')
 })

路由的模块化

const express = require('express')
const router = express.Router()
router.get('/user/list', (req, res) => {
res.send('Get user list.')
})
router.get('/user/menu', (req, res) => {
res.send('Get user list.')
})
module.exports = router

然后在其他文件导入
const userRouter = require('./router/user.js')
//app.use(userRouter)
app.use('/api', userRouter) //那么访问这个userRouter所有的对象时,url都需要加上api前缀

//定义一个最简单的全局中间件函数
//中间件的一个作用,由于所有的中间件公用req和res,那么就可以在上游的中间件中添加自定义的属性或方法,供下游的中间件或路由使用
//什么是中间件,在app.use()函数里的都可以被成为中间件

const mw = function(req, res, next){
console.log('这是最简单的中间件函数')
//把流转关系,转交给下一个中间件或路由
next()
}
//全局生效的中间件,所有访问服务器的请求都会调用
app.use(mw)
const mw = function(req, res, next){
    console.log('这是最简单的中间件函数')
    const time = Data.now()
    req.startTime = time
    next()
}
app.use(mw)
app.get('/', (req, res)=>{
res.send('Home page.' + req.startTime)
})

//局部生效的中间件

const mw = (req, res, next) => {
console.log('调用了局部生效的中间件')
next()
}
app.get('/', mw, (req, res) => {
//会先执行mw函数,再执行此函数
res.send({
state:0,
msg:'GET 请求成功!',
data:'dataMSG'
})
})

//定义多个局部中间件
//以下两种写法等价,会依次执行各个中间件

app.get('/', mw1, mw2, (req, res) => { res.send('Home page.')})
app.get('/user', [mw1, mw2], (req, res) => { res.send('Home page2.')})

p48中间件的分类

//什么是跨域(称为CORS),网页打开的地址和ajax访问的地址不同
比如用浏览器打开本地的.html文件,然后点击其页面中的按钮,用Get/Post访问远端的服务器,就叫跨域。
解决跨域的方法
1.CORS(主流的解决方案,推荐使用,它只支持GET,POST,HEAD,不支持PUT,DELETE)
2.JSONP(有缺陷,只支持GET请求)
解决
1.npm install cors
2.const cors = require(‘cors’)
3.在路由之前调用app.use(cors())

CORS请求分为
1.简单请求
2.预简请求,它在正式发送请求之前会发送预请求,来检查服务器是否访问的通。

JSONP:
浏览器通过

在Express中使用Session认证
安装express-session中间件
npm install express-session

var session = require('express-session')
app.use(session({
secret:'keyboard cat',//这个value值可以任意
resave:false//固定写法
saveUninitialized:true//固定写法
}))

向session中存数据

app.post('/api/login', (req, res) => {
if(req,body.username !== 'admin' || req.body.password != '00000'){
return res.send({status:1, msg:'登陆失败'})
}
req.session.user = req.body //用户信息
req,session.islogin = true //登陆状态
res.send({status:0, msg:'登陆成功'})
})

//从session中取数据

app.get('api/username', (req, res) => {
if(!req,session,islogin){
return res.send({status:1, msg:'fail'})
}
res.send({
status:0,
msg:'success',
username:req.session.user.username,
})
})

//清空session,比如用户推出时需要清空

app.post('/api/logout', (req, res) => {
req.session.destroy()
res.send({
status:0,
msg:'退出登陆成功',
})
})

JWT认证机制
Session认证机制需要配合Cookie才能实现,由于Cookie默认不支持跨域访问,所以当涉及到前端跨域请求后端接口的时候,需要很多额外的配置,才能实现Session认证。
当存在在跨域时,推荐使用Session身份认证。
当需要跨域时,不推荐使用Session,推荐使用JWT认证机制。
什么是JWT
JWT(JSON Web Token)是目前最流行的跨域认证解决方案。
JWT的工作原理:
客户端把用户名密码发送给服务器,服务器对用户名和密码加密成字符串,也就是Token,再把它发给客户端,客户端下次请求时通过请求头的Authorization字段,将Token发送给服务器,服务器受到后,把Token解密成用户名和密码,然后再验证,成功则返回给请求的内容。
请求头中Authorization字段:
Authorization:Bearer
JWT机制是把Token保存在客户端的,然后服务器去解密
Session机制是把Cookie保存在客户端和浏览器端的。
Token的组成:
Header.Payload.Signature
Payload是加密后的用户名和密码
Header和Signature是安全性相关的部分,只是为了保证Token的安全性。

sudo snap install postman

在这里插入图片描述

参考:B站

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

类和对象——(4)特殊的成员函数

归纳编程学习的感悟, 记录奋斗路上的点滴, 希望能帮到一样刻苦的你! 如有不足欢迎指正! 共同学习交流! 🌎欢迎各位→点赞 👍 收藏⭐ 留言​📝 一个人不是在逆境中成长,就…

4/150:寻找两个正序数组的中位数⭐ 5/150最长回文子串

题目:4/150寻找两个正序数组的中位数 给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。 算法的时间复杂度应该为 O(log (mn)) 。 题解1:暴力 暴力思路简介&#x…

JAVA毕业设计113—基于Java+Springboot+Vue的体育馆预约系统(源代码+数据库+12000字论文)

基于JavaSpringbootVue的体育馆预约系统(源代码数据库12000字论文)113 一、系统介绍 本项目前后端分离,本系统分为管理员、用户两种角色 用户角色包含以下功能: 注册、登录、场地(查看/预订/收藏/退订)、在线论坛、公告查看、我的预订管理、我的收藏…

综合实验—增强分析和配置中小型企业网络的综合能力

实验拓扑、实验编址如下图表所示,本实验模拟了一个企业网络场景, 其中R1和R2为公司总部路由器,交换机S1、S2、S3组成了总部的园区网,R3、R4、 R5为公司分部的路由器。 总部园区网中3台交换机都运行MSTP协议,用来防止二…

统计3个点的6种结构在三角形内的占比

平面内的3个点只可能有6种结构 1 - - - - 4 - - - - - - - - - - - - - - - - - - - - - - - 1 - - - 1 - - 1 1 - 1 1 - 2 - - - - 5 - - - - - - - - - - - - - - - 1 - - - 1 - - - 1 - - 1 - …

回归分析:预测和建模

回归分析:预测和建模 写在开头1. 回归分析的基本概念2. 回归分析的方法2.1 简单线性回归2.1.1 数学知识2.1.2 应用举例2.2 多元线性回归2.2.1 数学公式和应用2.2.1 应用场景举例2.3 多项式回归2.3.1 数学公式和应用2.3.2 应用场景举例2.4 逻辑回归2.4.1 数学公式和应用2.4.2 应…

Shell循环:whileuntil

一、特点:循环次数[一定]是固定的 二、while语句结构 while 条件测试 do 循环体 done 当条件测试成立(条件测试为真),执行循环体 演示: 需求:每秒显示一个数字,一…

MySQL进阶_EXPLAIN重点字段解析

文章目录 第一节.准备1.1 版本信息1.2 准备 第二节.type2.1 system2.2 const2.3 eq_ref2.4 ref2.5 ref_or_null2.6 index_merge2.7 unique_subquery2.8 range2.9 index2.10 all 第三节. Extra3.1 No tables used3.2 No tables used3.3 Using where3.4 No matching min/max row3…

leetcode - 矩阵区域和

1314. 矩阵区域和 - 力扣&#xff08;LeetCode&#xff09; 给你一个 m x n 的矩阵 mat 和一个整数 k &#xff0c;请你返回一个矩阵 answer &#xff0c;其中每个 answer[i][j] 是所有满足下述条件的元素 mat[r][c] 的和&#xff1a; i - k < r < i k, j - k < c …

Day48力扣打卡

打卡记录 最大化城市的最小电量&#xff08;二分前缀和差分数组贪心&#xff09; 链接 class Solution:def maxPower(self, stations: List[int], r: int, k: int) -> int:n len(stations)sum list(accumulate(stations, initial0))for i in range(n):stations[i] sum[…

速达软件全系产品存在任意文件上传漏洞 附POC

@[toc] 速达软件全系产品存在任意文件上传漏洞 附POC 免责声明:请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,所产生的一切不良后果与文章作者无关。该文章仅供学习用途使用。…

Fiddler抓包工具之fiddler设置手机端抓包

fiddler设置手机端抓包 安卓手机抓包 第一步&#xff1a;配置电脑和安卓的相关设置 1、手机和fiddler位于同一个局域网内&#xff1b;首先从fiddler处获取到ip地址和端口号&#xff1a; &#xff0c;点击online&#xff0c;最后一行就是ip地址 2、路径&#xff1a;Tools》O…

栈和队列的OJ题--13.用队列实现栈

13. 用队列实现栈 225. 用队列实现栈 - 力扣&#xff08;LeetCode&#xff09; /*解题思路&#xff1a; 此题可以用两个队列去实现一个栈&#xff0c;每次始终保持一个队列为空&#xff0c; 入栈操作相当于给非空队列进行入队操作 出栈操作相当于非空队列的队尾元素出队&…

RT-Thread ADC_DMA

看到这里&#xff0c;相信大家已经尝试过网上各类ADC_DMA传输的文章&#xff0c;且大多都并不能实现&#xff0c;因为在RT-Thread中并没有找到关于ADC的DMA接口&#xff0c;在官方例程中有关DMA的传输也只有一个串口接收的介绍&#xff0c;找遍全网怕也没能找到真正有用的消息。…

0基础学java-day13

一、包装类 1. 包装类的分类 1) 针对八种基本数据类型相应的引用类型【对象】—包装类 2) 有了类的特点&#xff0c;就可以调用类中的方法。 3) 如图: 2 包装类和基本数据的转换 3 案例演示 Integer01.java package com.hspedu.wrapper;/*** author 林然* version 1.0*/ p…

Python的模块与库,及if __name__ == ‘__main__语句【侯小啾python领航班系列(二十四)】

Python的模块与库,及if name == __main__语句【侯小啾python领航班系列(二十四)】 大家好,我是博主侯小啾, 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ…

RC低通滤波电路直接带载后会发生什么?

1、滤波的含义 滤波是频域范畴&#xff0c;它说的是不同频率的信号经过一个电路处理后&#xff0c;信号发生变化的问题&#xff0c;变化包含了原始信号幅值和相位的变化&#xff0c;滤波电路对信号的幅值做出的响应称为幅频响应&#xff0c;对信号相位做出的反应称为相频响应。…

19.字符串——查找三个字符串中的最大字符串(打擂台)

文章目录 前言一、题目描述 二、题目分析 三、解题 程序运行代码 四、举一反三总结 前言 本系列为字符串处理函数编程题&#xff0c;点滴成长&#xff0c;一起逆袭。 一、题目描述 查找三个字符串中的最大字符串 二、题目分析 打擂台 三、解题 程序运行代码 #include<…

Jave内存模型 与 CPU硬件架构 的交互图

JMM里所讲的主内存、工作内存与Java内存区域中的Java堆、栈、方法区等并不是同一个层次的对内存的划分&#xff0c;这两者基本上是没有任何关系的。 如果两者一定要勉强对应起来&#xff0c;那么从变量、主内存、工作内存的定义来看&#xff0c;主内存主要对应于Java堆中的对象…

Python进度条魔法解密,任务进展新玩法!

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 在日常编程和应用开发中&#xff0c;展示进度条是一种常见的技巧。不仅能够提供用户友好的体验&#xff0c;还可以显示任务执行的进度。Python作为一种多才多艺的编程语言&#xff0c;提供了多种方法来创建进度条…
最新文章