Nodejs 学习笔记和实例【 一篇全覆盖:写后端 api 接口完全够了】

作者:神秘网友 发布时间:2021-02-23 13:20:03

Nodejs 学习笔记和实例【 一篇全覆盖:写后端 api 接口完全够了】

本文pdf下载

Nodejs学习笔记

Node.js官方API文档

一、基础知识

1. 命令行窗口

  1. dir命令:列出当前目录下所有的文件夹名字;

  2. md命令:创建一个文件夹;

  3. rd命令:删除一个文件夹;

  4. path环境变量的作用:当我们在命令行窗口中使用命令打开一个文件或者调用一个程序时,系统会首先在当前目录下寻找文件或程序,如果在当前目录下找到了则直接打开,如果没有找到则会到环境变量path的路径下寻找。如果都没有找到则报错。

  5. 所有我们可以将一些经常需要访问的程序和文件的路径添加到path中,这样我们就可以在任意位置访问这些文件和程序了。

2. Node.js简介

node.js是一个能够在服务器端运行JavaScript的开放源代码、跨平台JavaScript运行环境。

3. Node的用途

Node处理请求时单线程,访问的人太就会出问题的。

  1. Web服务API,比如REST;
  2. 实时多人游戏;
  3. 后端的Web服务,例如跨域、服务器端的请求;
  4. 基于Web的应用;
  5. 多用户端的通信,如即时通信

二、模块化

1. 模块化简介

  1. 一个js文件就是一个js模块;
  2. 在node中,通过require()函数来引入外部的模块,require()可以传递一个文件路径作为参数,node将会自动根据该路径来引入外部模块,这里的路径,如果使用相对路径,必须要以.或者..开头。
  3. 使用requore()函数引入模块后,该函数会返回一个对象,这个对象代表的是引入的模块。
  4. 在node中,每一个js文件中的js代码都是独立运行在函数中。而不是全局作用域,所以一个模块中的变量和函数在其他模块中是无法访问的。但是可以通过exports(module.exports)来向外暴露变量和方法!,只需要将需要暴露给外部的变量和方法设置为export的属性即可。
  5. 在node中有一个全局对象global,它的作用和网页中的window类似,在全局中创建的变量和方法会作为global中的属性和方法保存。
  6. exports和module.exports的区别:exports只能使用.的方式来向外暴露内部变量;而module.exports可以使用.的形式,也可以直接赋值对象。

模块(第三方)的引用:从当前目录的node_modules依次向上级寻找,只要存在就可以使用。

创建模块:

//1.使用exports单个导出
exports.x=10;
exports.y=20;
exports.add=function(a,b){
returna+b;
};

//2.使用module.exports整体导出
module.exports={
name:"码农云库",
age:2,
mul:function(a,b){
returna*b;
}
}

使用模块:

//1.引入模块
varmath=require("./math");
console.log(math);
//2.使用模块(通过exports单个导出的)
console.log(math.x);
console.log(math.add(1,2));
//3.使用模块(通过module导出对象形式)
console.log(math.age);
console.log(math.age);
console.log(math.mul(2,8));

2. 包的简介

  1. CommonJS的包规范允许我们将一组相关的模块组合到一起,形成一组完整的工具。CommonJS的包规范由包结构和包描述文件两部分组成。包结构:用于组织包中的各种文件。包描述文件package.json:描述包的相关信息,以供外部读取分析。
  2. 包结构:包实际上就是一个压缩文件,解压以后还原为目录。符合规范的目录,应该包含如下文件:package.json---描述文件,bin---可执行二进制文件,lib---js代码,doc---文档,test---单元测试。

3. npm简介

  1. 全称:Node Package Manager;(包管理器,就相当于一个应用商店,我们可以下载自己想要的包);
  2. CommonJS包规范是理论,NPM是其中一种实践;
  3. 对于Node而言,NPM帮助其完成了第三方的模块发布、安装和依赖等。借助NPM,Node与第三方模块之间形成了很好的一个生态系统。
  4. 当我们安装好node以后,会自带一个npm;

npm常用命令

  1. npm -v :查看版本;
  2. npm :帮助说明;
  3. npm search 包名 :搜索包名;
  4. npm install 包名 :在当前目录下安装包;
  5. npm install 包名 -g :全局模式安装包;
  6. npm remove 包名 :删除包;
  7. npm install 包名 --save 安装包并添加到依赖中;(常用)
  8. npm install :下载当前项目所依赖的包(根据package.json);

淘宝npm镜像

当我们在项目中npm install 太慢时,可以使用淘宝镜像来提高npm的速度;

  1. 临时使用
npm--registryhttps://registry.npm.taobao.orginstallexpress1
  1. 持久使用
npmconfigsetregistryhttps://registry.npm.taobao.org1
  1. 通过cnpm使用
npminstall-gcnpm--registry=https://registry.npm.taobao.org1

使用原来的服务器使用npm,如果网速很慢可以使用淘宝镜像代替,使用cnpm下载;

通过npm下载的包都放在node_modules文件夹中;通过npm下载的包可以直接通过包名引入即可。

node搜索包的流程

node在使用模块名来引,入模块时,它会首先在当前目录下的node_modules中寻找是否含有该模块,如果有则直接使用,如果没有则去上一级目录寻找,直到找到为止。

三、Buffer缓冲区

Buffer的结构和数组很像,操作的方法也和数组类似;

数组不能存储二进制文件,而buffer就是专门用来存储二进制数据的;但在显示时都是16进制形式(00 - ff);

使用buffer不需要引入模块,可以直接使用;

//1.方式一:将一个字符串转换为
Buffervarstr="Hello";
varbuf=Buffer.from(str);
console.log(buf);

//2.方式二:Buffer一旦确定大小,连续内存,不能更改大小
varbuf=Buffer.alloc(10);
buf[0]=15console.log(buf);

//3.方式三:但是可以包括敏感数据(不清除原来的数据)
varbuf=Buffer.allocUnsafe(10)
console.log(buf);

//将Buffer数据转换为字符串
varbuf=Buffer.from("这是数据");
console.log(buf.toString());

四、文件读写(fs模块)

sf文件系统

  1. 在Node中,与文件系统的交互是非常重要的,服务器的本质就是将本地的文件发送给远程的客户端。
  2. Node通过fs模块来和文件系统进行交互,该模块提供了一些标准的文件访问PAI来打开、读取、写入文件,以及与其交互。
  3. 要使用fs模块,首先需要对其进行加载,const fs = require("fs")

1. 同步文件写入

  1. 打开文件:fs.openSync(path[, flags, mode])
  2. 写入内容:fs.writeSync(fd, buffer[, offset[, length[, position]]])
  3. 保存并关闭文件:fs.closeSync(fd)
//1.导入模块
varfs=require("fs");
//2.打开文件
varfd=fs.openSync("hello.txt","w");
//3.写入内容
fs.writeSync(fd,"码农云库的Node学习!");
//4.保存关闭
fs.closeSync(fd);

2. 异步文件写入

  1. 打开文件:fs.open(path[, flags[, mode]], callback)
  2. 写入内容:fs.write(fd, buffer[, offset[, length[, position]]], callback)
  3. 保存并关闭:fs.close(fd, callback)
//1.导入模块
varfs=require("fs");
//2.打开文件
fs.open("hello.txt","w",function(err,fd){
if(!err){//打开成功
//3.写入内容
fs.write(fd,"异步写入内容!",function(err){
if(!err){
//4.关闭文件
fs.close(fd,function(err){
if(!err){
console.log("写入成功,已关闭文件!");
}
});
}
});
}
});

3. 简单文件写入

一步到位:

varfs=require("fs");
fs.writeFile("hello.txt","简单文件写入",function(err){
if(!err){
console.log("写入成功!");
}
});

4. 流式文件写入

不管是同步、异步、简单文件写入都不适合大文件的写入,性能较差,容易导致内存溢出。

//1.导入模块
varfs=require("fs");
//2.创造流
varws=fs.createWriteStream("hello.txt");
//监听事件
ws.once("open",function(){
console.log("打开文件监听!");
});
ws.once("close",function(){
console.log("关闭文件!");
});
//3.写入内容
ws.write("1.第一步\n");
ws.write("2.第二步\n");
ws.write("3.第三步\n");
//4.关闭流
ws.end();

5. 文件读取

简单读取文件:

  1. 异步:fs.readFile(path[, options], callback)
  2. 同步:fs.readFileSync(path[, options])
varfs=require("fs");
fs.readFile("hello.txt",function(err,data)
console.log(data.toString());
});

流式文件读取:

  1. 如果要读取一个可读流中的数据,必须要为可读流绑定一个data事件,data事件绑定完毕,它会自动开始读取数据。
  2. pipe() 可以将可读流中的内容直接输出到可写流中。
varfs=require("fs");
varrs=fs.createReadStream("hello.txt");

rs.once("open",function(){
console.log("文件打开了~");
});
rs.once("close",function(){
console.log("文件关闭了~");
});

//绑定data事件
rs.on("data",function(data){
console.log(data);
});
varfs=require("fs");
varrs=fs.createReadStream("hello.txt");
varws=fs.createWriteStream("1.txt");
rs.pipe(ws);

6. fs模块的其他方法

  1. fs.existsSync() :检查文件是否存在;
  2. fs.stat() :查看文件的状态;
  3. fs.unlinkSync(path):删除文件;
  4. fs.readdirSync(path):读取目录结构;

五、url模块和querystring模块

url模块

  1. url.parse():将url字符串转换为对象;
  2. url.format():将对象转换为字符串;

querystring模块

  1. qs.parse():将字符串进行切分后形成对象;
  2. qs.stringfy():将对象转换为字符串;
  3. qs.escape():对给定的str执行百分比url编码操作;
  4. qs.unescape():对给定的str执行url百分比解码操作;

parse的使用:

constqs=require("querystring");
letstring="name=nzspassword=123456";
letpersonObj=qs.parse(string);
console.log(personObj)
输出:{name:'nzs',password:'123456'}

letstring="name:nzs#password:123456";
letpersonObj=qs.parse(string,"#",":");
console.log(personObj)
输出:{name:'nzs',password:'123456'}

stringify的使用:

constqs=require("querystring");
letpeopleObj={name:'nzs',password:'123456'};
letstring=qs.stringify(peopleObj);
console.log(string)
输出:name=nzspassword=123456

letstring=qs.stringify(peopleObj,"*",":");
console.log(string);
输出:name:nzs*password:123456

escape和unescape的使用:

constqs=require("querystring");
letresult=qs.escape("name=码农");
console.log(result)
输出:name%3D%E7%A0%81%E5%86%9C

letstring="name%3D%E7%A0%81%E5%86%9C"
letresult=qs.unescape(string);
console.log(result);
输出:name=码农

六、nodemailer模块发送邮件

nodemailer模块可以实现发邮件。

下载:

npm install nodemailer

发送邮件:

constnodemailer=require("nodemailer")
letsendEmail=function(){
//1.创建发送邮件对象
vartransporter=nodemailer.createTransport({
//可以通过nodemailer库下面的lib/well-known/services.json下可以查看配置邮箱配置
host:"smtp.qq.com",
port:465,
secure:true,//useSSL
auth:{
user:'1837290753@qq.com',
pass:'这个用自己的'
}
});

//2.邮件信息
varmailOptions={
from:'"Test

Nodejs 学习笔记和实例【 一篇全覆盖:写后端 api 接口完全够了】 相关文章

  1. 《面向对象》读书笔记3

    第三章 理解OOP:编程语言的历史 机器语言、汇编语言、高级语言、结构化编程、GOTO语句、全局变量、局部变量 本章介绍OOP出现之前的编程语言。 OOP结构非常简练,但另一方面也非常复杂,因此理解其结构和用途并不简单。不过,理解OOP也由捷径可循,那就是先

  2. 一些省选中较为基础的数学知识笔记

    之前那个任务计划太乱了 决定把数学的单独分出来 之后可能也会把其它的分出来,然后计划里只剩链接就好了 拉格朗日插值 「TJOI2018」教科书般的亵渎 模板题 杀死所有怪物需要$m+1$张“亵渎” $f(n)=\sum_{i=1}^{n+1}i^{m+1}$为$m+2$次多项式 每次取$m+3$个点

  3. Markdown 笔记

    title: Markdown 笔记 date: 2021-02-17 13:12:58 tags: Markdown categories: [Markdown] latex: true mathjax: true 插入代码: $ \Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,. $$$\Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,.$$使用:```markdown$ \Gam

  4. JS原型个人笔记

    一.原型(prototype)有什么用为什么出现 function student(name,age){ this.name = name; this.age = age; this.study = function(){ console.log("学习~") } } var stu = new student(); var stu1 = new student();//这样有多少个学生对象,就要多开辟多少

  5. 个人笔记-markdown使用入门

    1. Markdown基本语法 目录前 目录 1. Markdown基本语法 1.1. Markdown基本语法 1.2. Markdown 语法手册 (完整整理版) 1.3. 编辑器 1.4. VS Code 搭建高效 markdown 编辑环境 1.5. TOC自动生成目录 文档标题应该「SHOULD」这样写。 1.6. 标题 1.6.1. 这是三

  6. Redis学习笔记(一)安装

    一、Redis简介 Redis是完全开源的,遵守BSD协议,是一个高性能的key-value数据库。 Redis 与其他 key - value 缓存产品有以下三个特点: 1)Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。 2)Redis不仅仅支持简

  7. C++Primer plus学习记录第一日.1

    最近在深入一些炫目的源码,发现了大量的CPP的身影,各种C函数穿插其中,我发现我的CPP的学习之路必须开始了。从C转过来的我感觉到这个写法还是比较亲切的。但是特性也好多,我选择C++Primer plus这本经典的书籍进行入门的学习~ 编译的环境选择微软的Visual

  8. [学习笔记] SAM——后缀自动机

    [学习笔记] SAM——后缀自动机 零.前言 ? 真是给我整的有够难受的,这个SAM,也不算搞懂了。只是粗浅的理解了一下,且在这里试图将它写下来。 ?上面是这个笔记的初稿,现在做了一些题,感觉自己不说懂完了,但是还是有一点点点点东西的。/cy 一.概念 1.自动

  9. LeetCode 41. 缺失的第一个正数

    新手学习中,有任何错误或者更好地方法、思路欢迎指教! #Array 6 题目难度: 困难 题目描述: 给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。进阶:你可以实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案吗示例 1:输

  10. 基于android的app开发!Android之内存泄漏调试学习与总结,深度好文

    一,鸿蒙核心内容掌握程度 看看下面这些鸿蒙知识点你掌握了多少: 基础环境和开发工具 开发工具安装 运行开发工具完成基础配置DevEco Studio 运行第一个hello world 运行第一个页面 通过代码创建页面 Feature Ability 编程实现页面跳转 市面上的鸿蒙教程大多

每天更新java,php,javaScript,go,python,nodejs,vue,android,mysql等相关技术教程,教程由网友分享而来,欢迎大家分享IT技术教程到本站,帮助自己同时也帮助他人!

Copyright 2020, All Rights Reserved. Powered by 跳墙网(www.tqwba.com)|网站地图|关键词