1. 对 Node.js 的理解
(1)node.js
- Node.js不是一门新的语言,是一个javascript的运行环境,在node的环境下;我们可以使用js脱离浏览器端独立运行.
- node里有模块化的概念,node里的npm(包管理器,node,package,manager)可以快速的进行模块的管理.
- 我们可以使用node的http模块,进行服务器的搭建,或者使用express模块,进行服务器的快速搭建.
(2)node的特点:
- 1 . 单线程
2 . 异步的非阻塞式();
3. 以事件驱动; - node的 使用场景:
1. 后台开发;
2. 使用node自带的npm功能,方便的安装,删除,管理第三方模块, 不是说想用npm就一定写node代码,npm只要安装node环境;可以只用npm,不写node.js的任何代码;
3. node的兼容性很好,windows, linux, macOS均可使用 node环境,node的0.6版本之后,会直接预装npm不用单独安装npm.
2. http:
- node里搭建服务器使用的是http模块有一些常用的模块不需要npm下载,而node预装好的 http模块 已经安装好,不需要在进行安装。
1).引入对应的模块 require(“模块名)
var http =require("http");
2).http协议:基于请求和响应的模式,如果响应完毕,服务器与客服端断开链接,http是典型的短链接。
3) .createServer :
1. 创建server;
2. 设置监听,为了监听是否有人访问服务器 所以必须设置监听,因为不知道会什么时候访问服
务器,监听一旦设置,服务端会在底层开启一个死循环,不断监听是否有人发起请求,一旦有
请求会触发回调函数。
3. 请求头和请求体的理解:
(1)、req(requres对象)请求对象
① 请求头:请求头很短,包含本次请求的基本信息,请求头会发起请求时被浏览器直接解析
常用的req属性:
url:当前的路径
method:当前的请求方式(get/post)
② 请求体:当post请求时,要传递的数据会存放在请求体里,那么请求体会很大,在获取
post数据时,默认情况下无法一次性获取,我们需要分段获取,这时就需要监听post数据
传来的一个事件,在监听的回调里做数据拼接。
③ 与post请求者有关的方法:
data: 当post的请求数据传递过来时,会触发该事件,所以我们需要监听该事件
end:当post请求的数据传递完毕时,会触发该事件,所以我们也需要监听该事件
(2)、 res(response对象)响应对象
响应头/响应体
响应头:设置给前端传递数据时,数据的一些配置信息,如文件格式,编码格式等
writeHead(响应码,对象)第二个参数如果不写系统会自动添加,值是默认值
响应体:决定想前端返回什么内容
res.write()
4).创建一个服务器,返回值是服务器对象
var server=http.createServer(function (req,res) {
console.log(req.url,req.method);
/*
req: 请求对象(request),里面储存了网络请求的所有信息
res: 相应对象(response),我们会使用该对象的本次请求做出回应
createServer里的回调函数当接受前台的请求时会触发该函数
*/
//设置响应头
res.writeHead(200,{
"content-type":"text/html;charset=utf-8"
});
res.write("<h2>这是标题2标签");
res.end("响应结束!");
});
5) .设置监听的端口号
server.listen(3000);
3.fs模块:
fs模块 : node专门用来处理文件的模块
- 引入fs模块
const fs = require('fs');
- 读取文件内容
fs.readFile("readme.txt","utf-8",function (err,data) { //readme.txt 文件已经写好
if (err){
console.log(err);
} else{
console.log(data);
}
})
console.log("aaa");
4.event监听:
- 引入事件监听:
const eventEmitter = require('events');
- 创建事件监听对象
const event=new eventEmitter();
- 设置一个监听
/*
on(监听的名字,监听对应的回调函数)
*/
event.on("an",function () {
console.log("监听到此事件");
});
// 触发事件emit (触发的事件名)
setTimeout(function () {
event.emit("an");
},2000);
5.modules:
node.js的核心思想
- 模块(modules)和包(package);
模块本质上是一个文件,该文件的类型可以是js,json,也可以是其他语言编译过后的文件(c,c++) - 优点:可以方便的实现代码的抽离和复用
- 为了方便的实现模块化,node给每一个文件都设置了require和exports功能
- require是为了引用外部的模块, exports是引用的文件的入口对象,是唯一入口,每当我们引用一个模块时,系统都会返回给我们其对应文件的exports对象
//坑点:引入自己的模块,路径前面加 "./ " const per=require("./6-persson"); // console.log(per.name); per.setName("姓名"); console.log(per.getName()); // per.getName("别的"); // console.log(per.getName()); const phone=require("./7-phone"); const p1=new phone("华为"); p1.call();
6.url:
/*
node里的url包 专门用来处理网络地址
*/
let url=require("url");
let urlStr="http://www.baidu.com:8080/a/b/c/d/index.html?name=zhangsan&age=20#sPage";
/*
# :哈希值 该值不会传到服务器,其作用是为了控制页面的偏移
*/
// 把 url地址解析成地址 第二个参数填true,系统会自动解析query字符串,将其转化成对象
let urlobj=url.parse(urlStr,true);
console.log(urlobj);
console.log(urlobj.query.name,urlobj.query.age);
/*
protocol: '协议名',
slashes: 协议名后面是否加双斜杠
auth: 认证授权,
host: 域名加端口号,
port: '端口号',
hostname: '域名',
hash: '哈希值',
search: '?+参数',
query: '',
pathname: '/a/b/c/d/index.html',
path: '/a/b/c/d/index.html?name=zhangsan&age=20',
href:
'http://www.baidu.com:8080/a/b/c/d/index.html?name=zhangsan&age=20#sPage'
protocol: 协议名
slashes: 协议名后面是否加双斜杠
auth: 认证授权
host: 域名+端口号
port: 端口号
hostname: 域名
hash: 哈希值
search: ?+参数
query: 参数
pathname: 路径
path: 路径+参数
href: 完整url
*/
7.package:
包 :本质上是一个文件夹(目录) ,是由多个模块组成的,npm(node,package,manager)包管理器,管理的就是包;
- node对于报的管理,遵循的是common.js规范(规定了js脱离浏览器端之后的一些标准,语法等)
- 在引用包时直接写包名即可, 这时需要指定包的入口文件。如果不指定入口文件,系统默认为
index.js
;如果想要自己指定入口文件需要到对应包的package.json里,修改main字段后的文件改成自己想要的 - common.js规定,在创建或下载包时,每个包里必须要有一个
package.json
文件,该文件里储存了与当前包里有关的所有数据的配置信息(包括包的入口文件) - node允许我们使用交互式的方法创建
package.json
1、进入到对应包的目录下cd
目录
windows:dir
查看当前目录下所有文件
mac:ls
查看当前目录下的所有文件
2、 npm init /npm init -y; - 如果想引用系统的包
命令:npm i 包名; npm install 包名 npm i包名@ 版本号 npm install 包名@ 版本号
先要保证先前项目里有package.json 文件
那么,有了package.json之后,所有下载的包都会在里面产生依赖并记录,
好处: 以后在上传或者传递项目时不需要传送node_modules文件夹,接收者在拿到项目文件后,只需要运行npm i/ npm install 命令 ,就可以重新安装所有的依赖包。
8.path:
path包, node里专门用来处理路径的模块化包
引入path包
var path = require("path");
9.util:
node 里的util包,用来做继承;
引入:let util=require("util");
10.events_module:
let eventE=require("events");
//创建event对象
let event=new eventE();
- events模块是node里很多模块的基类,如http.fs这些模块都是直接或者间接继承与events所以http,fs这些模块都是可以实用化events的方法如on(),emit()等;
监听:
event.on("eventone",function () {
console.log("这是eventone");
})
一次监听:
event.once("onevent",function () {
console.log("一次性触发");
})
/*
设置最大监听数 emitter.setMaxListeners()设置监听数
*/
event.setMaxListeners(12);
event.on('abc',function () {
console.log("abc");
});
event.on('abc',function () {
console.log("abc");
});
event.on('abc',function () {
console.log("abc");
});
event.on('abc',function () {
console.log("abc");
});
event.on('abc',function () {
console.log("abc");
});
event.on('abc',function () {
console.log("abc");
});
event.on('abc',function () {
console.log("abc");
});
event.on('abc',function () {
console.log("abc");
});
event.on('abc',function () {
console.log("abc");
});
event.on('abc',function () {
console.log("abc");
});
event.on('abc',function () {
console.log("abc");
});
event.emit("abc");
11.express:
express模块 是node里对http模块的再次封装
Express是一个自身功能极简,完全是路由和中间件构成一个web开发框架:从本质上来说,一个Express应用就是在调用各种中间件。
/*
中间件
语法: app.use(路由(可省略), 函数(error,req,res,next))(三个参数的是让error去掉)
中间件是在请求开始与请求结束中间需要做的一些额外的操作,我们在中间件里一般不会做请求的返回,都会让该中间件向下执行,向下执行next
使用场景
1 处理特殊的请求设置,body-parser
2 实现cors跨域资源共享(cross-origin-resource-sharing)
中间件与路由的区别
1 使用层面上,在中间件里去处理额外的逻辑不做数据的返回,真正的数据返回还要留给路由去处理
2 在路由参数上,中间件可以省略,路由不省略,中间件对路由
*/