Nodejs(文件操作,构建服务器,express,npm)

文章目录

  • 文件操作
    • 1.读取文件
      • 1)步骤
      • 2)范例
    • 2.写文件
      • 1)步骤
      • 2)范例
    • 3.删除文件
    • 4.重命名文件夹
    • 5删除文件夹
  • Url
    • 1.url.parse()
    • 2.url.fomat()
  • Query
    • 1.query.parse()
    • 2.query.stringfy()
    • 3.编码和解码
  • 第三方模块
    • 1.nodemailer
    • 2.body-parser
  • 构建服务器
    • 2.响应
      • 范例1
      • 范例2(end)
      • 范例3(将对象等变为字符串)
  • Node中的js
    • 1.核心模块(内置~)
    • 2.模块系统
      • 1)加载与导出
  • ip地址和端口的概念
  • 响应内容类型 Content-Type
  • 发送文件中的数据
  • npm
  • Node 简易爬虫
  • Express
    • 1.Experss基本使用
      • 1)步骤
      • 2)API接口的构成要素
      • 3)API接口的书写
  • express 路由
  • 中间件(middlewear)
    • 1.自定义中间件
      • 1)全局
      • 2)局部中间件
    • 2.内置中间件(静态资源目录)
  • node 中的异步操作
  • 异步回调promise
    • 1.promise
    • 2.promise链式调用

文件操作

1.读取文件

1)步骤

  • 使用require方法加载fs核心模块
  • 读取文件
//使用require方法加载fs核心模块
var fs=require('fs')
//读取文件
// 参数1:读取的文件的路径
// 参数2:回调函数
//     成功:data:数据
//           error: null
//     失败:data:undefined
//           error:错误对象fs.readFile('',function(error,data){});

2)范例

在这里插入图片描述
helloworld.js

var fs = require("fs");fs.readFile("hello.txt", function (error, data) {console.log(data);
});

hello.txt

hello Node

在这里插入图片描述

在这里插入图片描述

2.写文件

1)步骤

//使用require方法加载fs核心模块
var fs=require('fs')
//写文件
// 参数1:文件的路径
// 参数3:文件内容
// 参数2:回调函数
//     成功:文件写入成功
//           error: null
//     失败:文件写入失败
//           error:错误对象fs.readFile('',function(error){});

2)范例

写文件.js

var fs = require("fs");
fs.writeFile("写文件.txt", "腹有诗书气自华", function (error) {console.log("文件写入成功");
});

在这里插入图片描述

在这里插入图片描述

注意:如果文件不存在,会创建文件,并写入指定内容,如果文件存在,则内容会被重新覆盖

要想不被覆盖,可以使用appendFile,追加在后面

3.删除文件

var fs=require('fs');
fs.unlink('./创建文件.txt',function(error){
})
3.创建文件夹
var fs=require('fs');
fs.mkdir('./创建文件',function(error){
})

4.重命名文件夹

var fs=require('fs');
fs.mkdir('./创建文件','./重命名文件',function(error){
})

5删除文件夹

注意只能删除空文件

var fs=require('fs');
fs.rmdir('./创建文件',function(error){
})

Url

1.url.parse()

将url字符串转换成对象

var url=require('url');
let urlString='http:49.95.207.1:3000/fcj/recommend/hot/hehe?us=123#nihao'
let urlObj=url.parse(urlString);
console.log(urlObj)

在这里插入图片描述

2.url.fomat()

将url对象转换成字符串

let obj = {protocol: "http:",slashes: null,auth: null,host: null,port: null,hostname: null,hash: "#nihao",search: "?us=123",query: "us=123",pathname: "49.95.207.1:3000/fcj/recommend/hot/hehe",path: "49.95.207.1:3000/fcj/recommend/hot/hehe?us=123",href: "http:49.95.207.1:3000/fcj/recommend/hot/hehe?us=123#nihao",
};
let string = url.format(obj);
console.log(string);

在这里插入图片描述

Query

1.query.parse()

将字符串变为对象
在这里插入图片描述

2.query.stringfy()

将对象变为字符串
在这里插入图片描述

3.编码和解码

在这里插入图片描述

第三方模块

1.nodemailer

const nodemailer = require("nodemailer");
// 创建发送邮件的请求对象
const transporter = nodemailer.createTransport({host: "smtp.qq.com", //发送方邮箱 通过lib/wellknown/services.jsonport: 465,secure: true, // Use `true` for port 465, `false` for all other portsauth: {user: "2843306836@qq.com", //发送方的邮箱地址pass: "vsclqhgqfpuxdecd", //mtp验证码},
});
// 邮件信息
let mailobj = {from: '"Maddison Foo Koch 👻" <2843306836@qq.com>', // sender addressto: "2843306836@qq.com", // list of receivers  初设bar@example.com, baz@example.comsubject: "Hello ✔", // Subject line// 文本信息和html信息只能有一个text: "您的验证码是8520,有效期为五分钟", // plain text body// html: "<b>Hello world?</b>", // html body
};
// 发送邮件
transporter.sendMail(mailobj, function (error, data) {});

2.body-parser

var express = require('express')
var bodyParser = require('body-parser')var app = express()
// app.use表示使用中间件// 解析表单数据
app.use(bodyParser.urlencoded({ extended: false }))// 解析json数据
app.use(bodyParser.json())app.use(function (req, res) {res.setHeader('Content-Type', 'text/plain')res.write('you posted:\n')res.end(JSON.stringify(req.body, null, 2))
})

构建服务器

在Node中提供了一个核心模块,http
这个模块用来创建编写服务器
1.简单的http服务
1)步骤
● 加载http核心模块
● 使用http.createServer()方法加载一个服务器
● 提供服务:对数据的服务
发请求
接收请求
处理请求
给反馈(发送响应)
注册request请求事件
当客户端请求过来,就会自动触发服务器的request请求事件,执行第二个参数,回调处理函数
● 绑定端口号,启动服务器

// 加载http核心模块
var http=require('http');
// 使用http.createServer()方法加载一个服务器
// 返回一个Server实例
var server=http.createServer();
// 提供服务(当服务器接受请求之后要干的事)
sever.on('request'function(){...})
// 绑定端口号,启动服务器
server.listen(3000,function(){});

2)范例
在这里插入图片描述
注意:当运行时会打印出在这里插入图片描述
此时控制台无法输入任何东西,因为在等待客户端请求
只有当在浏览器输入网址时,控制台会打印出
在这里插入图片描述
ctrl+c可以直接关闭服务器

2.响应

request请求事件处理函数需要接受两个参数:
Request请求对象
请求对象可以用来获取客户端的一些请求信息,例如请求路径
Response响应对象
响应对象可以用来给客户端发送响应消息

response对象有一个方法:write可以用来给客户端发送响应数据

write可以使用多次,但是最后一定要使用end来结束响应(告诉客户端话说完了,可以呈递给用户),否则客户端会一直等待
响应内容只能是二进制数据或者字符串

范例1

在这里插入图片描述
在这里插入图片描述

范例2(end)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

范例3(将对象等变为字符串)

在这里插入图片描述
在这里插入图片描述

Node中的js

Node只能执行一个文件

1.核心模块(内置~)

Node 为js提供了很多服务器级别的API,这些API绝大多数都被包装到了一个具名的核心模块中
例如文件操作的fs核心模块,http服务构建的http模块,path路径操作模块,os操作信息模块
在这里插入图片描述

2.模块系统

在这里插入图片描述
equire是一个方法,它的作用之一就是用来加载模块的
在Node中,模块有三种:
具名的核心模块:fs,http…
用户自己编写的文件模块

注意:在node中没有全局作用域只有模块作用域(即超出文件的函数或者变量声明不起作用)
外部访问不到内部,内部也访问不到外部
相对路径必须加./
可以省略后缀名

在这里插入图片描述
在这里插入图片描述

1)加载与导出

require方法有两个作用:
1.加载文件模块并执行里面的代码
2.拿到被加载文件模块导出的接口对象

在每个文件中都提供了一个对象:exports
exports默认是一个空对象
在这里插入图片描述
要做的就是把所有需要被外部访问的成员挂载到exports对象中
若要直接使用foo, 打印 ret.foo 输出hello
在这里插入图片描述

ip地址和端口的概念

所有联网的程序都需要进行网络通信
计算机中只有一个物理网卡,而且同一个局域网中,网卡的地址必须是唯一的
网卡是通过唯一的ip地址来进行定位的
ip地址用来定位计算机,端口号用来定位具体的应用程序
所有需要联网通信的软件都需要端口号
端口号的范围0~65536之间
可以同时开启多个服务,但一定要确保不同服务占用的端口号不一致

响应内容类型 Content-Type

浏览器在不知道服务器响应内容的编码的情况下会按照当前操作系统的默认编码(utf8)去解析
会导致中文乱码,中文操作系统默认是gbk

在http协议中,Content-Type就是用来告知对方发送的数据内容是什么类型
在线查询工具
https://tool.oschina.net/ 中的Http Mime-type

var http=require('http');
var server=http.createServer();
server.listen(3000,function(){console.log("Server is running")
})
server.on('',function(req,res){//防止乱码res.setHeader('Content-Type','text/plain;charset=utf-8')res.end("hello 世界")
})

发送文件中的数据

1.结合fs发送文件中的数据
2.Content-Type
不同资源对应的Content-Type不一样
图片不需要指定编码,一般只为字符数据指定编码

npm

1.npm命令

npm init -y // 可以跳过向导 ,快速生成
npm install //一次性把dependencies全部安装
npm install 包名  //只下载   简写 npm i 包名
npm install --save 包名  //下载并保存依赖项(package.json文件中的dependencies)  简写npm -S 包名 npm uninstall 包名  //只删除,依赖项会保存  简写 npm un 包名
npm uninstall --save //删除的同时依赖信息也去除  简写 npm un -S包名

Node 简易爬虫

获取目标网站
分析网站内容
获取有效信息,下载或者其他操作

Express

通过express框架书写API
非关系数据库mongodb
1.什么是API
在这里插入图片描述
2.登录接口逻辑分析
● 接收用户传递数据
● 处理数据
● 返回数据

1.Experss基本使用

1)步骤

安装express

var express = require("express");
var app = express();
// 最简单的APi接口
app.get("/user/login", function (req, res) {console.log("你好");res.send("注册成功");
});
app.listen(3000, function () {//监听300端口 开启服务器console.log("server start");
});

2)API接口的构成要素

ip
port
pathname
method :get post
接收用户数据 数据格式后端决定

get请求 用req.query接受参数
在这里插入图片描述

3)API接口的书写

接收数据

● get req.query
● post req.body
需要第三方插件body-parser 插件进行解析
注意数据格式 json x-www-form-urlencoded formdata

express 路由

由于接口会有公共的网址 例如user/del user/add
为了使代码简化,可以使用路由
在这里插入图片描述

userRouter.js

var express = require("express");
var router = express.Router();router.get("/add", function (req, res) {res.send("user add");
});router.get("/del", function (req, res) {res.send("user del");
});module.exports = router;

server.js

var express = require("express");
var app = express();let userRouter = require("./router/userRouter");
app.use("/user", userRouter);app.listen(3000, function () {console.log("server start");
});

在这里插入图片描述

中间件(middlewear)

内置中间件
自定义中间件(全局 局部)
第三方中间件

1.自定义中间件

1)全局

全局自定义

var express = require("express");
var app = express();// next 是否继续往下执行
app.use("/", function (req, res, next) {console.log("中间件");// next()
});// 如果是根路径/  即上面代码等价于
// app.use(function (req, res, next) {
//   console.log("中间件");
//   // next()
// });app.listen(3000, function () {console.log("server.start");
});
app.get("/test1", function (req, res) {console.log("test1");let { token } = req.query;if (token) {res.send("ok");} else {res.send("no");}
});
app.get("/test2", function (res, req) {console.log("test2");if (token) {res.send("ok");} else {res.send("no");}
});

在这里插入图片描述
在这里插入图片描述

当运行并发送请求时,被app.use拦截
因为中间件用的 /
/text1 /text2 中间件都具有这个符号
当发送请求时,会优先处理中间件的处理函数
如果中间件处理函数中有next() 会继续往下执行

2)局部中间件

var express = require("express");
var app = express();app.listen(3000, function () {console.log("server.start");
});app.get("/test1",function (req, res, next) {console.log("fun1");next();},function (req, res) {console.log("fun2");res.send("test1");}
);

2.内置中间件(静态资源目录)

指定一个目录(如hehe),可以被访问
在这里插入图片描述
__dirname可以获得代码所在文件的绝对路径E:\Nodejs\products,然后将目标目录相对于staitc.js的相对路径拼接拼接

static.js

// 让hehe变为可访问
var express = require("express");
var app = express();
var path = require("path");
// console.log(__dirname);
// console.log(path.join(__dirname, "./hehe"));app.listen(3000, function () {console.log("server start");
});app.use(express.static(path.join(__dirname, "./hehe")));

在这里插入图片描述
如果app.use(‘/public’,express.static(path.join(__dirname, “./hehe”)));
在这里插入图片描述

node 中的异步操作

● fs模块对文件的几乎所有操作都有同步和异步两种形式
● 例如:readFile()和readFileSync()
● 区别:
同步调用会阻塞代码的执行,异步则不会
异步调用会将读取任务下达到任务队列,直到任务执行完成才会回调
异常处理方面,同步必须使用try,catch方式,异步可以通过回调函数的第一个参数

异步回调promise

如果异步操作需要保持一定的执行顺序 则需要回调函数的嵌套来实现 会导致回调地域

解决方法:promise asyc /await(es7)

1.promise

promise是抽象的异步处理对象以及对其进行各种操作的组件,promise并不是从javaScript中发祥的概念
promise最初被提出是在E语言中,它是基于并列/并行处理设计的一种编程语言
现在js也拥有该特性,就是js promise

var fs = require("fs");// 将异步操作封装到promise函数里
function delfile() {return new Promise(function (resolve, reject) {// 异步操作fs.unlink("./hehe.js", function (err) {if (err) {reject("失败了");//会向.then 函数传递信息 msg=失败了} else {resolve("成功");//err=成功 }});});
}
// promise对象可以跟两个函数.then .catch
// 如果执行reject 走catch
// 如果执行resolve 走.then
delfile().then(function (msg) {console.log("then" + msg);}).catch(function (err) {console.log("catch" + err);});

2.promise链式调用

在一组链式调用中只需要一个catch

var fs = require("fs");
const { resolve } = require("path");
// 1.封装
function isExist() {return new Promise(function (resolve, reject) {fs.stat("./hehe.js", function (err, stats) {if (err) {reject("文件不存在");} else {resolve("文件存在");}});});
}function delfile() {return new Promise(function (resolve, reject) {fs.unlink("./hehe.js", function (err) {if (err) {reject("删除失败");} else {resolve("删除成功");}});});
}isExist().then(function () {console.log("isExist 的成功处理");return delfile();}).then(function () {console.log("删除文件的成功处理");}).catch(function (err) {console.log("catch");console.log(err);});

在这里插入图片描述
理解:isExist函数返回的是一个promise对象,使用.then 方法后执行到return delFile(),会返回一个新的promise对象(用来删除文件),新的promise对象的.then方法会继续执行
无论哪个函数中间执行错误,都会调用catch函数()
在这里插入图片描述

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

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

相关文章

BUUCTF-Misc24

从娃娃抓起1 1.打开附件 是两个文本文件 2.电报码 电报码在线翻译网站&#xff1a;https://usetoolbar.com/convert/cccn.html 3.汉字五笔编码 汉字五笔编码在线网站查询&#xff1a;https://www.qqxiuzi.cn/bianma/wubi.php 4.转化为MD5值 将文字保存到文本文档 用winR输入…

部署ELK日志分析系统——超详细

ELK日志分析系统 文章目录 ELK日志分析系统资源列表基础环境一、环境准备二、部署Elasticsearch软件2.1、安装Elasticsearch软件2.2、加载系统服务2.3、更改Elasticsearch主配置文件2.4、创建数据存放路径并授权2.5、启动Elasticsearch2.6、查看节点信息 三、安装Elasticsearch…

【WEEK13】 【DAY5】Shiro第五部分【中文版】

2024.5.24 Friday 接上文【WEEK13】 【DAY4】Shiro第四部分【中文版】 目录 15.7.Shiro请求授权的实现15.7.1.修改ShiroConfig.java15.7.1.1.添加一行验证授权的代码15.7.1.2.重启 15.7.2.修改MyController.java15.7.3.修改ShiroConfig.java15.7.4.重启15.7.5.修改UserRealm.ja…

Jenkins 动态salve简单配置连接 EKS

安装Jenkins helm repo add jenkins https://charts.jenkins.io helm repo update # 当前版本 jenkins-5.1.18.tgz瘦身后的 values.yaml # grep -Ev ^\s*#|^$ values.yaml nameOverride: fullnameOverride: namespaceOverride: clusterZone: "cluster.local" kubern…

C#对文件进行批量重命名或者对某个单独的文件进行改名

目录 一、FolderBrowserDialog 二、OpenFileDialog 三、Path 四、ui设计 五、代码部分 一、FolderBrowserDialog FolderBrowserDialog是一个用于选择文件夹的对话框控件&#xff0c;可以在windows Forms应用程序中使用。使用它可以让用户选择一个文件夹&#xff0c;并返…

【编译原理复习笔记】中间语言

中间语言 中间语言的特点和作用 &#xff08;1&#xff09;独立于机器 &#xff08;2&#xff09;复杂性介于源语言和目标语言之间 中间语言可以使编译程序的结构在逻辑上更为简单明确 常用的中间语言 后缀式 图表示&#xff1a;抽象语法树&#xff0c;有向无环图 三地址代…

【软件设计师】先导

一、考试科目&#xff1a; 上午&#xff1a;计算机与软件工程知识&#xff0c;考试时间150min&#xff0c;75空单选题&#xff08;不一定一题一空&#xff09; 下午&#xff1a;软件设计&#xff0c;考试时间150分钟&#xff0c;问答题&#xff0c;6道只做5大题&#xff08;前四…

【论文阅读】Prompt Fuzzing for Fuzz Driver Generation

文章目录 摘要一、介绍二、设计2.1、总览2.2、指导程序生成2.3、错误程序净化2.3.1、执行过程净化2.3.2、模糊净化2.3.3、覆盖净化 2.4、覆盖引导的突变2.4.1、功率调度2.4.2、变异策略 2.5、约束Fuzzer融合2.5.1、论据约束推理2.5.1、模糊驱动融合 三、评估3.1、与Hopper和OSS…

QTextEdit将多个字符作为一个整体,不可单独修改

考虑一个问题&#xff0c;QTextEdit如何实现类似微信和QQ聊天输入框中的“xxx”效果&#xff0c;其内容作为一个整体&#xff0c;以突出颜色显示&#xff0c;并且不可以单独编辑修改&#xff0c;只能整体删除修改。 突出颜色显示有很多方式可以实现&#xff0c;例如 通过setT…

Rust学习心得

我分享一下一年的Rust学习经历&#xff0c;从书到代码都一网打尽。 关于新手如何学习Rust&#xff0c;我之前在Hacker News上看到了这么一篇教程&#xff1a; 这篇教程与其他教程不同的时&#xff0c;他不是一个速成教程&#xff0c;而是通过自己的学习经历&#xff0c;向需要…

记录一次Netty的WSS异常

概述 业务场景 应用通过 WSS 客户端连接三方接口。在高并发压测时&#xff0c;出现了请求服务器写入失败的异常&#xff0c;该异常是偶发&#xff0c;出现的概率不到千分之一&#xff0c;异常如下图所示。 问题概述 注意&#xff1a; 因为握手是通过 http 协议进行的。所以…

tcpdump源码分析

进入tcpdump.c&#xff08;函数入口&#xff09;之前&#xff0c;先看一些头文件netdissect.h里定义了一个数据结构struct netdissect_options来描述tcdpump支持的所有参数动作&#xff0c;每一个参数有对应的flag, 在tcpdump 的main 里面&#xff0c; 会根据用户的传入的参数来…

鸿蒙ArkTS声明式开发:跨平台支持列表【触摸事件】

触摸事件 当手指在组件上按下、滑动、抬起时触发。 说明&#xff1a; 开发前请熟悉鸿蒙开发指导文档&#xff1a; gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md点击或者复制转到。 从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独…

总是等不是办法,向媒体投稿你得学会用新方法

初入信息宣传领域,我怀揣着对文字的热爱与传播价值的热情,肩负起了单位活动的宣传报道重任。那时的我,满脑子都是传统的投稿思维:精心撰写每一篇稿件,然后逐一搜寻各大媒体的投稿邮箱,一封封邮件满怀期待地发出,像播撒希望的种子,渴望在广袤的媒体土壤中生根发芽。然而,理想很丰…

红蓝对抗-HW红蓝队基本知识(网络安全学习路线笔记)

第一, 什么是蓝队 蓝队&#xff0c;一般是指网络实战攻防演习中的攻击一方。 蓝队一般会采用针对目标单位的从业人员&#xff0c;以及目标系统所在网络内的软件、硬件设备同时执行多角度、全方位、对抗性的混合式模拟攻击手段&#xff1b;通过技术手段实现系统提权、控制业务、…

将点位转换为圆环极坐标绘画

将一段染色体可视化为一个圆环,根据一段基因的起始点和终止点绘画,根据基因的方向绘画箭头,可以任意确定染色体哪个位置在哪个角度上,例如染色体的1700点位在180上,默认是顺时针方向从起始点向终止点绘画。 1.将一段染色体的基因数组加上极坐标绘画属性 function compute…

pycharm连接阿里云服务器过程记录

因为不想用自己的电脑安装anaconda环境,所以去查了一下怎么用服务器跑代码,试着用pycharm连接阿里云服务器,参考了很多博客,自己简单配置了一下,记录一下目前完成的流程. 主要是:阿里云服务器的远程登录和安装anaconda,以及怎么用pycharm连接阿里云服务器上的解释器. 小白刚开始…

Day 3:1738. 找出第 K 大的异或坐标值

Leetcode 1738. 找出第 K 大的异或坐标值 给你一个二维矩阵 matrix 和一个整数 k &#xff0c;矩阵大小为 m x n 由非负整数组成。 矩阵中坐标 (a, b) 的 值 可由对所有满足 0 < i < a < m 且 0 < j < b < n 的元素 matrix[i][j]&#xff08;下标从 0 开始计…

Dou音滑块日志分析

记得加入我们的学习群&#xff1a;961566389 点击链接加入群聊&#xff1a;[https://h5.qun.qq.com/s/62P0xwrCNO](https://h5.qun.qq.com/s/62P0xwrCNO) 1.插桩-打印日志 获取背景和滑块的图片的接口一看没啥参数需要逆向的 验证的接口body参数需要进行逆向&#xff0c;直接…

浅谈Docker容器的网络通信原理

文章目录 1、回顾容器概念2、容器网络3、容器与主机之间的网络连通4、交换机的虚拟实现---虚拟网桥&#xff08;Bridge&#xff09;5、Docker 守护进程daemon管理容器网络 1、回顾容器概念 我们知道容器允许我们在同一台宿主机&#xff08;电脑&#xff09;上运行多个服务&…