Node.js学习记录

news2025/7/7 9:00:49

一、Node.js简介

        浏览器中JavaScript在浏览器中的运行环境(代码正常运行需要的环境),

         Node.js后端的运行环境,通过Node.js可以实现用JavaScript后端开发

        Node.js是一个基于Chrome V8引擎的JavaScript运行环境

二、fs文件系统模块

     读取指定文件中的内容

                fs.readFile()语法格式: fs.readFile(path[,options],callback)   

 代码:

const { log } = require('console')
//引入fs模块进行文件操作
const fs = require('fs')
// 1.参数路径
// 2.输出格式
// 3.会点函数,返回失败和成功的结果
fs.readFile('./readFile/read.text','utf8',(err,dataStr)=>{
    log(err)
    log('======')
    console.log(dataStr);
})

   

 代码展示:

const { log } = require('console')
//引入fs模块进行文件操作
const fs = require('fs')
// 1.写入文件路径
// 2.写入内容
// 3.编码格式,默认是utf8,可以省略
// 4.回调函数
fs.writeFile('./readFile/read.text','55566665','utf8',(err,data)=>{
    log(err)
    console.log(data);
})

绝对路径和相对路径,代码运行时会以执行node命令时所在的目录,动态的拼接出被操作文件的完整路径。

解决fs模块路径拼接的问题

 三、path模块

 

../   会抵消一层路径

 获取文件名

  移出文件扩展名

 

 四、HTTP模块

 代码:

//引入http请求
const http=require('http')
//创建服务
const server = http.createServer()
//监听请求
server.on('request',(req,res)=>{
    console.log('触发了请求');
})
//启动服务
server.listen(8080,()=>{
    console.log('启动服务');
})

 

 

 res.setHeader('Content-Type','text/html; charset=utf-8')

五、模块化

module.exports导出      require引入

module.exports默认是空对象

 exports指向module.exports对象

时刻谨记,使用require()模块时,得到的永远是module.export指向的对象

六、包管理 

指定下载包的版本   npm i 包@版本号

npm uninstall 包名称     卸载包

-D  将包记录到dev节点中,仅开发使用

i5ting_toc

i5ting_toc -f 要转换的md文件路径 -o

require()引入包使用

 ...展开运算符

npm包配置项

{
    "name": "xc-tools",
    "version": "1.0.0",
    "main": "index.js",
    "description": "初次提交,用于提交测试,输入什么返回什么",
    "keywords": [
        "xc",
        "tools"
    ],
    "license": "ISC"
}

七、模块加载机制

 

 八、express模块

//1.导入express
const express = require('express')
//2.创建web服务器
const app=express()
//3.调用listen(端口号,启动成功后的回调函数),启动服务器
app.listen(80,()=>{
    console.log('服务启动成功');
})

 监听客户端请求,实现数据传递

//1.导入express
const express = require('express')
//2.创建web服务器
const app=express()
//4.监听客户端请求
//监听get请求
app.get('/user',(req,res)=>{
    res.send({name:'zs',age:20})
})
//监听post请求
app.post('/user',(req,res)=>{
    res.send('请求成功')
})
//3.调用listen(端口号,启动成功后的回调函数),启动服务器
app.listen(80,()=>{
    console.log('服务启动成功');
})

获取url上面的query参数

//1.导入express
const express = require('express')
//2.创建web服务器
const app=express()
//4.监听客户端请求
//监听get请求
app.get('/user',(req,res)=>{
    res.send({name:'zs',age:20})
})
//监听post请求
app.post('/user',(req,res)=>{
    res.send('请求成功')
})
//5.通过req.query获取客户端发送过来的查询参数
app.get('/',(req,res)=>{
    //注意在默认情况下,req.query是一个空对象
    console.log(req.query);
})
//3.调用listen(端口号,启动成功后的回调函数),启动服务器
app.listen(80,()=>{
    console.log('服务启动成功');
})//1.导入express
const express = require('express')
//2.创建web服务器
const app=express()
//4.监听客户端请求
//监听get请求
app.get('/user',(req,res)=>{
    res.send({name:'zs',age:20})
})
//监听post请求
app.post('/user',(req,res)=>{
    res.send('请求成功')
})
//5.通过req.query获取客户端发送过来的查询参数
app.get('/',(req,res)=>{
    //注意在默认情况下,req.query是一个空对象
    console.log(req.query);
})
//3.调用listen(端口号,启动成功后的回调函数),启动服务器
app.listen(80,()=>{
    console.log('服务启动成功');
})

通过req.params获取:匹配到的动态参数(params参数)  /use:id/:name传递两个参数也是可以的

//1.导入express
const express = require('express')
//2.创建web服务器
const app=express()
//4.监听客户端请求
//监听get请求
app.get('/user',(req,res)=>{
    res.send({name:'zs',age:20})
})
//监听post请求
app.post('/user',(req,res)=>{
    res.send('请求成功')
})
//5.通过req.query获取客户端发送过来的查询参数
app.get('/',(req,res)=>{
    //注意在默认情况下,req.query是一个空对象
    console.log(req.query);
})
//6.获取:id动态参数
app.get('/user/:id',(req,res)=>{
    console.log(req.params);
    res.send(req.params)
})
//3.调用listen(端口号,启动成功后的回调函数),启动服务器
app.listen(80,()=>{
    console.log('服务启动成功');
})

express.static()托管静态资源

//7.通过express.static()托管静态资源
app.use(express.static('./无用'))

  

 

  nodemon实现自动重启项目的效果,nodemon 文件名

express路由

 

    创建路由模块

//这是路由模块
//1.导入express
const express = require('express')
//2.创建路由对象
const router = express.Router()
//3.挂载具体的路由
router.get('user/list',(req,res)=>{
    res.send('调用了list接口')
})
//4.导出路由对象
module.exports=router

注册路由模块

const express = require('express')
const app=express()
const router=require('./路由模块')
app.use(router)
app.listen('80',()=>{
    console.log('服务启动成功');
})

app.use()函数的作用,就是用来注册全局中间件

app.use('/api',routre) 给路由添加前缀

九、express中间件

 

 

 定义中间件函数

const express = require('express')
const app = express()
//定义一个最简单的中间件函数
const mv = (req,res,next)=>{
    console.log('这是最简单的中间件');
    //把流转关系,转交给下一个中间件或路由
    next()
}
app.listen(80,()=>{
    console.log('服务启动成功');
})

 全局express中间件

const express = require('express')
const app = express()
//定义一个最简单的中间件函数
const mv = (req,res,next)=>{
    console.log('这是最简单的中间件');
    //把流转关系,转交给下一个中间件或路由
    next()
}
//将mv注册为全局生效的中间件
app.use(mv)
app.listen(80,()=>{
    console.log('服务启动成功');
})

全局中间件的简写形式

const express = require('express')
const app = express()
//定义全局中间件的简写形式
app.use((req,res,next)=>{
    console.log('这是最简单的中间件');
    //把流转关系,转交给下一个中间件或路由
    next()
})
app.listen(80,()=>{
    console.log('服务启动成功');
})

中间件的作用

const express = require('express')
const app = express()
//定义全局中间件的简写形式
app.use((req,res,next)=>{
    // 获取到请求的时间
    const time = Date.now()
    //为req对象,挂载自定义属性,从而把事件共享给后面所有的路由
    req.startTime=time
    next()
})
app.get('/',(req,res)=>{
    res.send('获取到请求的时间:'+req.startTime)
})
app.listen(80,()=>{
    console.log('服务启动成功');
})

 定义多个全局中间件,连续定义,依次执行

 局部中间件的使用

const express= require('express')
const app = express()
const mv=(req,res,next)=>{
    console.log('我是局部中间件');
    next()
}
//第二个参数传入对应的局部中间件
app.get('/',mv,(req,res,)=>{

})
app.listen(80,()=>{
    console.log('服务器启动成功');
})

数组形式或者依次添加

 依次执行,局部中间件需要放到路由前面

 中间件的5大分类

 应用级别的中间件

 

 错误级别的中间件要放在所有路由之后

const express= require('express')
const app = express()
//演示错误中间件
app.get('/',(req,res)=>{
    //人为的制造错误
    throw new Error('服务器内部发生错误')
    res.send('5555')
})
//定义错误级别的中间件,捕获整个项目的异常错误,从而防止程序的崩溃。
app.use((err,req,res,next)=>{
    res.send('错误信息:'+err.message)
})
app.listen(80,()=>{
    console.log('服务器启动成功');
})

 express.json解析body参数

const express= require('express')
const app = express()

//注意:除了错误级别的中间件,其他的中间件,必须在路由之前配置

//通过express.json() 这个中间件,解析表单中的JSON格式的数据
app.use(express.json())

app.post('/',(req,res)=>{
    //在服务端可以通过req.body来接收客户端发来的请求体
    //默认情况下,如果不配置解析表单数据的中间件,则req.body默认等于undefined
    // console.log(req.body);//undefined
    res.send(req.body)
})
app.listen(80,()=>{
    console.log('服务器启动成功');
})

 express.urlencoded()解析urlencoded格式的参数值

const express= require('express')
const app = express()

//注意:除了错误级别的中间件,其他的中间件,必须在路由之前配置

//通过express.json() 这个中间件,解析表单中的JSON格式的数据
app.use(express.json())
app.use(express.urlencoded({extended:false}))

app.post('/',(req,res)=>{
    //在服务端可以通过req.body来接收客户端发来的请求体
    //默认情况下,如果不配置解析表单数据的中间件,则req.body默认等于undefined
    // console.log(req.body);//undefined
    res.send(req.body)
})
app.post('/book',(req,res)=>{
    //在服务器端,可以通过req.body来获取JSON格式的表单数据和url-encoded格式的数据
    console.log(req.body);
    res.send('111')
})
app.listen(80,()=>{
    console.log('服务器启动成功');
})

 自定义中间件

 

 

 

const express = require('express')
const qs= require('querystring')
const app = express()
//自定义解析表单的中间件
app.use((req, res, next) => {
    //定义中间件具体业务逻辑
    //1.定义一个str字符串,专门用来存储客户端发送过来的请求体数据
    let str = ''
    //2.监听req的data事件
    req.on('data', (chunk) => {
        str += chunk
    })
    //3.监听req的end事件
    req.on('end',()=>{
        //打印完整的请求数据
        console.log(str);
        //把字符串格式的请求数据,解析成对象格式
        const body = qs.parse(str)
        // console.log(body);
        req.body=body
        next()
    })
   
})
app.post('/book',(req,res)=>{
    res.send(req.body)
})
app.listen(80, () => {
    console.log('服务器启动成功');
})

 

 使用express开发接口

进行接口的开发

服务器文件

const express = require('express')
//引入路由模块
const apiRouter = require('./路由模块化')
const app = express()
app.use(express.json())
app.use('/api', apiRouter)
//创建服务
app.listen(80, () => {
    console.log('服务器启动完成');
})

模块化文件

const express = require('express')
const apiRouter = express.Router()
//编写get接口
apiRouter.get('/', (req, res) => {
    //通过req.query获取客户端发送过来的数据
    const query = req.query
    res.send({
        code: 200,
        msg: '请求成功',
        data: query
    })
})
//编写post接口
apiRouter.post('/', (req, res) => {
    //获取客户端传递过来的数据
    const body=req.body
    //将数据返回
    res.send({
        code: 200,
        msg: '请求成功',
        data: body
    })
})
module.exports = apiRouter

基于CORS解决接口跨域的问题

 

 通过CORS解决跨域问题(回去实验下)

const express = require('express')

const app = express()
//一定要在路由之前,配置CORS这个中间件,从而解决接口跨域的问题
const cors = require('cors')   //使用const cors=require(’cors‘)导入中间件
app.use(cors()) 
app.use(express.json())
//引入路由模块
const apiRouter = require('./路由模块化')


app.use('/api', apiRouter)
//创建服务
app.listen(80, () => {
    console.log('服务器启动完成');
})

什么是CORS

 

 

 

 简单请求

预检请求

  

 JSONP接口

 

 

 十、MySQL的使用

  

 安装MySQL

主要组成部分 

 基本使用

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

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

相关文章

腾讯云短信告警

腾讯云短信告警 密钥获取地址:https://console.cloud.tencent.com/cam/capi #!/bin/python #-*- coding: utf-8 -*-import json, sys from tencentcloud.common import credential from tencentcloud.common.profile.client_profile import ClientProfile from tenc…

来!简单了解一下计算机发展史!

一、古代的运算工具 1.双手 当我们还是远古人的时候,我们用双手来进行计算 2.结绳、垒石 渐渐的,又出现了结绳记事和垒石记事 3.春秋战国时期 — 算筹 春秋战国的时候,广泛使用的算筹,根据不同的排列来表示不同的数字并进行计…

JavaScript基础(11)_方法、枚举对象中的属性、作用域

函数可以成为对象的属性。如果一个函数作为一个对象的属性保存,那么我们称这个函数是这个对象的方法,调用这个函数就是调用对象的方法(method) 比如:console.log()调用console对象的log方法。document.write() 调用document对象的write方法。…

RabbitMQ详解

RabbitMQ详解 文章目录RabbitMQ详解一、AMQP 和 JMS1.1 JMS1.2 AMQP1.3 两者对比二、RabbitMQ消息模型2.1 基本消息模型2.2 工作消息模型2.3 订阅模型2.3.1 Fanout 订阅模型2.3.2 Direct 订阅模型2.3.3 Topic 订阅模型三、消息持久化3.1 交换机持久化3.2 队列持久化3.3 签收机制…

玩推特营销必知的基础常识上篇

现如今,Twitter已从一个让人们分享其想法的地方变成了一个强大的营销,该可让品牌实时与受众交流。每月活跃用户超过3.21亿,很容易看出为什么公司在所有这些时间之后仍继续使用Twitter。但是,仅仅偶尔发出有关趋势的话题&#xff0…

S标签肽,H2N-KETAAAKFERQHMDS-OH

S Tag Peptide 是一种合成的多肽,由15个氨基酸残基构成。S Tag Peptide is a 15 amino acid peptide derived from RNase A. 编号: 188345中文名称: 多肽标签S-tag 、S标签肽英文名: S-tag peptide单字母: H2N-KETAAAKFERQHMDS-OH三字母: H2N-Lys-Glu-Thr-Ala-Ala-A…

mysql 从入门到放弃— 数据库设计

之前我们已经了解了 mysql 的基本增删改查 mysql 从入门到放弃——基本约束以及语法 现在我们系统的进行一遍数据库的设计,建议收藏 ~~ 直接进入主题 来个例子:下面我们将围绕这个例子来进行数据库的设计 我们就来简单的模拟 大学教务处的选课 系统 …

vue-生成二维码【生成、点击输入框内叉号移除生成的二维码、输入框聚焦】

博主介绍 📢点击下列内容可跳转对应的界面,查看更多精彩内容! 🍎主页:水香木鱼 🍍专栏:后台管理系统 文章目录 简介:这是一篇有关【vue-生成二维码【生成、点击输入框内叉号移除生成…

Cortex-M架构MCU位带操作最详细解析(主要以STM32为例,包括判断哪些MCU可用)

Cortex-M架构MCU位带操作最详细解析(主要以STM32为例,包括判断哪些MCU可用) 代码实践部分直接跳转: https://blog.csdn.net/weixin_53403301/article/details/125543844 一、位带操作理论及实践 位带操作的概念其实30年前就有了…

FlutterWeb性能优化探索与实践

美团外卖商家端基于 FlutterWeb 的技术探索已久,目前在多个业务中落地了App、PC、H5的多端复用,有效提升了产研的整体效率。在这过程中,性能问题是我们面临的最大挑战,本文结合实际业务场景进行思考,介绍美团外卖商家端在 FlutterWeb 性能优化上所进行的探索和实践,希望对…

【原生Ajax】全面了解xhr的概念与使用。

✍️ 作者简介: 前端新手学习中。 💂 作者主页: 作者主页查看更多前端教学 🎓 专栏分享:css重难点教学 Node.js教学 从头开始学习 ajax学习 文章目录XHR的基本使用  什么是XHR  使用xhr发起GET请求  了解xhr对象的readyState属性  使…

婴儿肠绞痛怎么办?

婴儿肠绞痛的原因婴儿绞痛是婴儿生活中最难解释的现象之一。没有人知道为什么有些婴儿比其他婴儿绞痛更严重,但有很多关于绞痛的理论。其中一个原因可能是一些婴儿的消化系统更不成熟或更敏感。婴儿消化道中用于分解食物的消化酶或消化液很少,尤其是淀粉…

图像锐化一:几个常见的滤波核

文章目录1.滤波核2.代码3. 效果分析示例1.示例2.图像锐化和图像平滑相对应,前者用于增强细节表现,后者一般用于降噪在图像锐化时,往往会 1. 放大 噪声,2. 引入aritfact, 3. 振铃效应 等负面效果 因此需要分析相关锐化方法的效果和…

计算机里一半的部件是什么

解码器 在下图中,“a”和“b”是来自左侧的输入。它们都连接到NOT门。NOT门产生与其输入相反的输入。页面上有四条垂直线,分别来自“a”和“b”以及“a”与“b”的反数,因此,对于每个“a”和“b”,页面上都有两条导线&…

Jira—使用 JMX 接口进行实时监控

使用 JMX 接口进行实时监控 什么是 JMX? JMX(Java Management Extensions) 是一种用于监视和管理 Java 应用程序的技术。JMX 使用称为 MBean(托管 Bean)的对象来公开应用程序中的数据和资源。 对于 Jira Server 或 Jira Data Center 的大型实例,启用 JMX 可以让您更轻松…

知识蒸馏算法汇总

知识蒸馏有两大类:一类是logits蒸馏,另一类是特征蒸馏。logits蒸馏指的是在softmax时使用较高的温度系数,提升负标签的信息,然后使用Student和Teacher在高温softmax下logits的KL散度作为loss。中间特征蒸馏就是强迫Student去学习T…

文件上传漏洞实验-通过截取http请求绕过前端javascript验证进行文件上传

1、什么是文件上传漏洞 文件上传漏洞是指网络攻击者上传了一个可执行的文件到服务器并执行。这里上传的文件可以是木马,病毒,恶意脚本或者WebShell等。这种攻击方式是最为直接和有效的,部分文件上传漏洞的利用技术门槛非常的低,对…

如何使用AI图片清晰度增强器软件增强和锐化图片、提高照片清晰度并去除噪点

通过使用深度学习AI算法对照片进行批量锐化、去噪和去模糊处理,该程序可以应用再大部分照片和图片,包括徽标、卡通和动漫 可能很多朋友都会遇到需要批量增强和锐化照片的情况:例如,如果拍摄过程中曝光不足、夜晚噪点多或者画面模…

基于蚁群算法的TPS问题求解策略研究(Matlab代码实现)

🍒🍒🍒欢迎关注🌈🌈🌈 📝个人主页:我爱Matlab 👍点赞➕评论➕收藏 养成习惯(一键三连)🌻🌻🌻 🍌希…

Java面试干货:关于数组查找的几个常用实现算法

查找算法在我们的面试和开发中,是很常见的一种算法,今天我就给大家介绍几个常用的查找算法。 一. 线性查找 1.概念 线性查找也叫顺序查找,这是最基本的一种查找方法。该算法是从给定的值中进行搜索,从一端开始逐一检查每个元素…