node基础介绍
node概念:
node是让javascript可以触及到服务器端的一个运行环境
node特性:
- 单线程 每次链接一个用户node都不会创建一个新线程只会用一个;
- 非阻塞式(io) io 输入输出 阻塞式io:网络请求的时候,数据库操作的时候,文件读取的时候 非阻塞式io: node在访问高io操作的一些内容时 不会等待他的完成,而是继续后面的操作,当完成之后会通过回调函数进行返回 特点:保证高效运行当前线程,不会造成浪费。
- 事件驱动 通过事件驱动整个程序的进行。 由于node是单线程 所有把高io的操作,会移动到事件队列中进行等待完成。完成后就会通过回调函数进行处理(官方名字:事件环)
node擅长的应用:
- 高并发
- 高io密集型应用
(如:聊天室、豆瓣的站内信、功夫熊app)
node不擅长 :
金融项目 银行项目 国家重要信息通信项目
node如何运行js:
- REPL 交互式解释器 可以在cmd中直接运行javascript;
注意:如果你要写多行的话 结尾的内容必须要放在最后。
思考:
js传统运行方式:通过html来引入js来运行
node可以直接运行js
魔术变量 双底杠__
__filename 当前运行的js脚本的文件名(可以输出当前运行的这个文件在电脑硬盘中的绝对路径)
__dirname 当前运行的js脚本所在文件夹的路径(不包含文件名)
node中的模块
模块是什么:一个js我们就可以称之为一个模块(把一个逻辑中或者式一个功能点中的内容拆分到多个文件中js)把这些细小的js文件拼装成一个整体的过程就是模块化开发。
模块有两种:
- 自定义模块
(1)暴漏(抛出) exports(返回的是模块化函数)或module.exports(模块本身)
通常情况下都是使用module.exports(模块本身);
(2)使用require()来引用; - 内置模块
Fs—文件系统 对系统上的文件进行读写操作----require(“fs”)
同步:同步操作会阻塞后续代码的实行;在遇到错误的时候后面的代码不会继续进行;
异步:异步操作不会阻塞后续代码;在遇到问题的时候还是会进行;
目录操作
(1)读取目录
readdirSync(path//必选的路径) 同步读取
readdir (path//必选的路径,options//可选的参数,callback(err,ok)//成功之后的回调函数) 异步读取
(2)创建目录
mkdirSync() 同步创建目录
mkdir(path//必选的路径,mode//可选的参数,callback(err)//没有成功信息) 异步创建目录
(3)重命名目录
rename(“修改的文件路径”,“新名字”,回调)
(4)删除目录
rmdir(“删除的文件路径”,回调) //删除目录的时候,只能删除空的目录
文件操作
(1)文件的写入 writeFile(filename,data,options,callback)
filename:文件名 data:写入的数据 options:可选,编码默认utf-8 callback:回调
如果文件不存在就新建,如果文件存在就会进行内容替换(options中写{flag:“a”}可以设置为追加);
(2)文件的读取 readFile(“读取的文件”,“字符编码”,callback)
(3)文件的删除 unlink(“删除的文件路径”,回调);
- http模块----创建服务器(服务器:性能非常稳定的计算机)----require(“http”)
创建服务器
createServer() 创建服务器 .listen(端口)
request接受 response响应
var http = require("http");
http.createServer((req,res)=>{
//1.设置响应头 http:状态值
res.writeHead(200,{"content-type":"text/html;charset=utf-8"});
res.end("服务器创建成功!");
}).listen(8848)
创建完后可以干嘛----可以进行前后端的交互了;
路由
通过url路径来区分不同的请求,从而来进行功能上的分发。
url模块—对当前的url进行操作
var http = require("http");
var url = require("url");
http.createServer((req,res)=>{
//1.设置响应头 http:状态值
res.writeHead(200,{"content-type":"text/html;charset=utf-8"});
//读取url信息 url.parse(req.url你请求信息的固定写法,true把url的数据转换成)
var urlPath = url.parse();
//当运行之后访问发现url返回了两次
//console.log(urlPath)
//解决二次请求
if(urlPath.pathname=="/第二次返回的内容"){
return;
}
//设置路由
if(urlPath.pathname=="/register"){
res.end("注册成功");
}
if(urlPath.pathname=="/login"){
res.end("登录成功")
}
console.log(urlPath);
res.end("服务器创建成功!");
}).listen(8848)
同步问题:
// 在程序中如果出错后面的不执行,那么会造成程序的崩溃。
// 解决同步出错的方法使用try{可能会出错的代码}catch(error){出错后的信息}
异步问题:
//在node的异步操作中,有一个叫做错误优先的原则,在回调中的第一个形参表示错误,默认为null;
//解决方式
if(err){
console.log("目录读取失败");
}else{
console.log(ok);
}
扩展
前端语言:对数据进行展示
后端语言:对数据进行处理
问题扩展(常见面试题)
多个回调函数层层嵌套----回调地狱
回调地狱会造成代码的可读性非常的差 在node中因为是非阻塞式io 所以node中经常会有回调地狱;
如何解决回调地狱:
promise asys/awiat 蓝鸟插件。。。。
promise 简单来说就是一个容器
保存的是未来才会结束的事件(保存的是异步操作)promise对象向可以将异步操作以同步操作的流程来执行,
var promise = new Promise((resolve,reject)=>{
//异步处理
//异步处理完后
resolve("成功之后调用");
reject("失败的时候调用");
})
Promise()
.then((ok)=>{
console.log(ok);
})//成功的时候调用
.catch((err)=>{
console.log(err);
})//失败的时候调用
前几周有事情忙,导致博客这几周都没写了(我是不会承认我懒了的,dui~我没懒)。当然我又双叒叕跨过了一个门槛,这让我松了一口气的同时,心里一紧,因为我认识的小伙伴们都已经找到了自己的工作。我也不知到我当初的选择是对是错,(后悔是不可能的)就继续坚持下去。我前辈教了我一句话:“如今你一定会感谢曾经努力的你!”。so saonian 人生还很长,认真的走下去。
小故事没找到,故事图也不错:
(我找来的图,原作者在图上)