nodeJs 学习

 

常用快捷键

 二、fs模块

回调函数为空,则表示写入成功!

练习


const fs = require('fs');
fs.readFile('../files/成绩.txt', 'utf-8', (err, dataStr) => {
  if (err) {
    console.log('读取失败');
    return err;
  }
  console.log('读取成功');
  const arr = dataStr.split(' ')
  const newArr = arr.map(item => item.replace('=', ':'));
  fs.writeFile('../files/02.txt', newArr.join('\r\n'), (err) => {
    if (err) {
      console.log('写入失败');
      return;
    }
    console.log('写入成功');
  })
})

fs模块,路径动态拼接,与执行的时候路径有关;

const fs = require('fs')

fs.readFile('D:\\ty\\code\\nodeJs\\nodeDemo01\\files\\02.txt', 'utf-8', (err,data) => {
  console.log(1,err,data)
})

fs.readFile(__dirname+'../../files/02.txt', 'utf-8', (err,data) => {
  console.log(2,err,data)
})

path模块

获取路径中的文件名

获取路径中的文件扩展名

案例

完整代码: 

const fs = require('fs');
const path = require('path');

const regStyle = /<style>[\s\S]*<\/style>/;
const regScript = /<script>[\s\S]*<\/script>/;
fs.readFile(path.join(__dirname, '../files/ty.html'), 'utf-8', (err, data) => {
  if (err) {
    return;
  }
  console.log(data)
  resolveCss(data)
  resolveJs(data)
  resolveHtml(data);

})

function resolveCss (htmlStr) {
  
  const r1 = regStyle.exec(htmlStr);
  // console.log(r1)
  const newCss = r1[0].replace('<style>', '').replace('</style>', '');
  // console.log(newCss)
  fs.writeFile(path.join(__dirname, './clock/index.css'), newCss, err => {
    console.log(err)
  })
}

function resolveJs (htmlStr) {
  
  const r1 = regScript.exec(htmlStr);
  console.log(r1)
  const newJs = r1[0].replace('<script>', '').replace('</script>', '');
  console.log(newJs)
  fs.writeFile(path.join(__dirname, './clock/index.js'), newJs, err => {
    console.log(err)
  })
}

function resolveHtml (htmlStr) {
  const newHtml = htmlStr
    .replace(regStyle, '<link rel="stylesheet",href="./css"></link>')
    .replace(regScript, '<script src="./index.js"></script>');
  fs.writeFile(path.join(__dirname, '/clock/index.html'), newHtml, err => {
    console.log(err)
  })
}

三http模块

const http = require('http');

const server = http.createServer();

server.on('request', function(req, res) {
  console.log('请求了')
})

server.listen(8080, () => {
  console.log('服务器已启动:http://127.0.0.1:8080')
})

根据不同的url相应不同的内容

四、模块化

npm与包

自定义npm包

发布包

模块的加载机制

五、Express

简介

安装

初步使用

const express = require('express');

const app = express();
app.get('/user', (req,res) => {
  res.send({
    name:'zs',age:20
  })
})
app.post('/user', (req,res) => {
  res.send('请求成功')
})

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

{

    "id": "22"

}

const express = require('express');

const app = express();
app.get('/user', (req,res) => {
  res.send({
    name:'zs',age:20
  })
})
app.get('/', (req, res) => {
  console.log(req.query);
  res.send(req.query)
})
app.get('/user/:id/:name', (req, res) => {
  // 动态匹配到的参数
  console.log(req.params);
  res.send(req.params)
})
app.post('/user', (req,res) => {
  res.send('请求成功')
})

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

静态资源托管

注意:前缀必须有“/”

nodemon的使用

路由

中间件

内置中间件

const express = require('express');
const { router } = require('./router')

const app = express();




// 定义一个中间件并注册为全局生效中间件
app.use((req, res, next)=> {
  console.log('这是最简单的中间件函数');
  const time = Date.now();
  req.startTime = time;
  next();
})

// 定义一个中间件并注册为全局生效中间件
app.use((req, res, next)=> {
  console.log('这是第二个中间件函数');
  next();
})

app.get('/', (req, res) => {
  throw new Error('服务器错误')
  res.send('/')
})

// 配置json格式中间件解析json格式数据
app.use(express.json());
app.use(router)

// 定义一个错误级别中间件
app.use((error,req, res, next)=> {
  console.log('这是错误级别中间件函数');
  res.send(error.message)
  // next();
})

app.listen(80, () => {
  console.log('服务器启动')
})
const express = require('express');
const router = express.Router();

// 定义局部中间件函数1
const mw1 = (req, res, next) => {
  console.log('局部中间件1')
  next()
}
// 定义局部中间件函数2
const mw2 = (req, res, next) => {
  console.log('局部中间件2')
  next()
}
router.get('/',mw1,mw2, (req, res) => {
  console.log(req.startTime);
  res.send('GET user list.')
})
router.get('/user/list',mw1,mw2, (req, res) => {
  console.log(req.startTime);
  throw new Error('服务器错误')
  res.send('GET user list.')
})
router.post('/user/add', (req, res) => {
  // 默认情况下,如果不配置解析表单数据的中间件,则req.body默认等于undefined
  console.log(req.startTime,req.body);
  res.send('Add new user.')
})


module.exports = {router}

express.urlencoded()

// 配置express.urlencoded()这个中间件解析表单中的url-encoded格式数据

app.use(express.urlencoded());

router.post('/book', (req, res) => {

  // 在服务端,可以通过req.body 来获取JSON格式的表单数据和url-encoded格式数据

  console.log(req.body)

  res.send('ok')

})

安装

npm i body-parser

引入:

const parser = require('body-parser');

// 配置express.urlencoded()这个中间件解析表单中的url-encoded格式数据

// app.use(express.urlencoded());

// 第三方中间件

app.use(parser.urlencoded({extended:false}));

自定义中间件 

const qs = require('querystring');

// 自定义一个中间件
app.use((req, res, next)=> {
  console.log('这是自定义中间件函数-解析表单数据');
  let str = '';
  req.on('data', (chunk) => {
    str += chunk;
  })
  req.on('end', () => {
    console.log(11,str)
    const body = qs.parse(str);
    console.log(22,body)
  })
  next();
})

// custom-body-parser.js
const qs = require('querystring');

const bodyParser = (req, res, next) => {
  console.log('这是自定义中间件函数-解析表单数据');
  let str = '';
  req.on('data', (chunk) => {
    str += chunk;
  })
  req.on('end', () => {
    console.log(11, str)
    const body = qs.parse(str);
    req.body = body;
    console.log(22, body)
    next();
  })
};

module.exports = {bodyParser}

const { bodyParser } = require('./custom-body-parser');

// 自定义解析表单的中间件

app.use(bodyParser);

5种解析数据的方法

const parser = require('body-parser');


//1、 配置json格式中间件解析json格式数据
// app.use(express.json());

// 2、配置express.urlencoded()这个中间件解析表单中的url-encoded格式数据
// app.use(express.urlencoded());

//3、 第三方中间件
// app.use(parser.urlencoded({extended:false}));

// 4、自定义一个中间件
// app.use((req, res, next)=> {
//   console.log('这是自定义中间件函数-解析表单数据');
//   let str = '';
//   req.on('data', (chunk) => {
//     str += chunk;
//   })
//   req.on('end', () => {
//     console.log(11,str)
//     const body = qs.parse(str);
//     req.body = body;
//     console.log(22, body)
//     next();
//   })
// })

// 5、自定义解析表单的中间件
app.use(bodyParser);

六、接口

 cors相关的3个请求头

JSONP请求

七、数据局MySQL

概念

分类

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

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

相关文章

SpringBoot整合WebService

WebService是一个SOA&#xff08;面向服务的编程&#xff09;的架构&#xff0c;它是不依赖于语言&#xff0c;不依赖于平台&#xff0c;可以实现不同的语言间的相互调用&#xff0c;通过Internet进行基于Http协议的网络应用间的交互。 其实WebService并不是什么神秘的东西&…

MISC:常见编码

一、字符编码 1.ASCII码 使用指定7位或8位二进制数组合表示128-256种可能。 常⻅考点&#xff1a;解题过程中给出十进制或十六进制的连续数值。 进制转换工具&#xff1a; ASCII text,Hex,Binary,Decimal,Base64 converter (rapidtables.com) 2.Base64编码 ASCII编码以8个比特…

鸿蒙Harmony应用开发—ArkTS(@Prop装饰器:父子单向同步)

Prop装饰的变量可以和父组件建立单向的同步关系。Prop装饰的变量是可变的&#xff0c;但是变化不会同步回其父组件。 说明&#xff1a; 从API version 9开始&#xff0c;该装饰器支持在ArkTS卡片中使用。 概述 Prop装饰的变量和父组件建立单向的同步关系&#xff1a; Prop变量…

马斯克的 Grok-1 开源,3140亿参数目前最大开源模型,最佳实践教程来啦

近几天开源社区最大的热点&#xff0c;莫过于埃隆马斯克信守承诺的最大开源模型Grok-1。 Grok-1 是一款 314B 大型专家混合 (Mixture of Expert&#xff0c;MoE) Transformer&#xff0c;作为基础模型&#xff0c;基于大量文本数据进行训练&#xff0c;没有针对任何具体任务进…

计算机二级Python题目3

题目来源&#xff1a;计算机二级Python半个月抱佛脚大法&#xff08;内呈上真题版&#xff09; - 知乎 目录 1. 基础题 1.1 基础题1 1.2 基础题2 1.3 基础题3 2. turtle绘图题 3. 大题 3.1 大题1 3.2 大题2 1. 基础题 1.1 基础题1 a,b,ceval(input()) ls[] for i in …

Base系列

1.计数系统 base,这个词在数学中表示基数&#xff0c;即计数系统中用于表示数字的不同符号的数量。 例&#xff1a; 二进制计数系统中只有两个符号表示数字&#xff0c;即0和1&#xff0c;故二进制系统可以用Base2表示。 十进制计数系统中仅使用十个符号表示数字&#xff0c;即…

二、阅读器的开发(初始)-- 2、阅读器开发

1、epubjs核心工作原理 1.1 epubjs的核心工作原理解析 epub电子书&#xff0c;会通过epubjs去实例化一个Book对象&#xff0c;Book对象会对电子书进行解析。Book对象可以通过renderTo方法去生成一个Rendition对象&#xff0c;Rendition主要负责电子书的渲染&#xff0c;通过R…

QT gridlayout 循环设置组件,表格也通用 已解决

在需求中。经常遇到&#xff0c;表格 展示需求。 几乎都是json格式的。 // 列表配置文件QJsonArray listJsonArray getCfgJsonData("details_tab_table_config.json");if (listJsonArray.isEmpty()){return;}ui->gridWidget->setMaximumSize(QSize(310, 180)…

Matlab在高光谱遥感中的作用:从数据处理到决策支持

光谱和图像是人们观察世界的两种方式&#xff0c;高光谱遥感通过“图谱合一”的技术创新将两者结合起来&#xff0c;大大提高了人们对客观世界的认知能力&#xff0c;本来在宽波段遥感中不可探测的物质&#xff0c;在高光谱遥感中能被探测。以高光谱遥感为核心&#xff0c;构建…

【机器学习300问】44、P-R曲线是如何权衡精确率和召回率的?

关于精确率和召回率的基础概念我已经写了两篇文章&#xff0c;如果友友还不知道这两个评估指标是什么&#xff0c;可以先移步去看看这两篇文章&#xff1a; 【机器学习300问】25、常见的模型评估指标有哪些&#xff1f;http://t.csdnimg.cn/JtuUO 总结一下这两个概念&a…

进度图画法

exce表格进度图画法&#xff0c;体现在条形图以及“格子”的空间的填充两种办法。 1.excel表格画进度图 备注&#xff1a;表格照着就是可以了&#xff0c;主要是画直线的办法 在形状的下拉菜单中选择直线&#xff0c;按住shift&#xff08;可以画直线&#xff09; 画直线后&a…

一站式App流量统计,Xinstall助您洞悉用户行为

在如今的移动互联网时代&#xff0c;App的推广和运营对于开发者来说至关重要。然而&#xff0c;想要精准掌握App的流量情况&#xff0c;却并不是一件容易的事情。这时&#xff0c;一款强大的App流量统计工具就显得尤为重要。而Xinstall&#xff0c;正是这样一款能够帮助开发者轻…

收集数据的二维码怎么做?创建表单活码的制作方法

通过二维码来收集用户信息是现在经常被使用的一种方式&#xff0c;通过扫码二维码展现表单&#xff0c;用户根据问题填写自己的想法或者信息&#xff0c;有效的简化用户操作的流程&#xff0c;也能够提升管理者获取信息的速度&#xff0c;能够快速针对用户数据做分析。 那么表…

PLC常用通信协议应用

PLC通信协议 ModbusModbus协议介绍Modbus协议的应用Modbus通信模式 Modbus RTU通讯Modbus RTU报文映射寄存器常见功能码数据类型Modbus CRC校验计算Modbus RTU举例&#xff08;读位&#xff09;Modbus RTU举例&#xff08;读字&#xff09; Modbus TCP协议应用TCP数据帧Modbus …

从0到1:企业官网小程序开发笔记(一)

可行性研究 企业公司官网小程序 &#xff0c;旨在为企业建立一个在线的官方网站&#xff0c;并提供公司的信息、产品、服务和联系方式等。它扩展了传统企业官网的功能&#xff0c;使用户能够通过微信小程序的便利性和互动性&#xff0c;方便用户随时随地获取企业信息&#xff…

ShardingSphere啦啦啦

N年前写的ShardingSphere部分&#xff08;上&#xff09;_sharding 分库不能sum-CSDN博客 https://shardingsphere.apache.org/document/current/en/quick-start/ 高性能架构模式&#xff1a; 读写分离&#xff1a;读写操作分散到不同的节点上 (这句话 我悟了) 据SQL语义分…

Elsevier(爱思唯尔)如何查询特刊special issue

1. 以Knowledge-Based Systems为例 网站&#xff1a;https://www.sciencedirect.com/journal/knowledge-based-systems 2.具体位置

网络工程师练习题6

网络工程师 综合题 计算并填写下表&#xff1a; TP地址191.23.181.13子网掩码255.255.192.0地址类型 &#xff08;1&#xff09;网络地址&#xff08;2&#xff09;直接广播地址&#xff08;3&#xff09;主机号&#xff08;4&#xff09;子网内的最后一个可用IP地址&#xf…

OrangeDAO联合创始人Don Ho确认出席Hack.Summit() 2024区块链开发者大会

随着Web3技术的快速发展&#xff0c;区块链领域备受关注的盛会——Hack.Summit() 2024 区块链开发者大会即将于 2024 年 4 月 9 日至 10 日在香港数码港隆重启幕。本次大会不仅是 Hack.Summit() 系列在亚洲的首次亮相&#xff0c;更象征着全球区块链行业对亚洲&#xff0c;尤其…

基于SpringBoot的网上订餐系统(含源文件)

&#xff08;源码附文章底部&#xff09; 摘 要 随着我国经济的飞速发展&#xff0c;人们的生活速度明显加快&#xff0c;在餐厅吃饭排队的情况到处可见&#xff0c;近年来由于新兴IT行业的空前发展&#xff0c;它与传统餐饮行业也进行了新旧的结合&#xff0c;很多餐饮商户开始…