node基础介绍

node概念:

node是让javascript可以触及到服务器端的一个运行环境

node特性:

  1. 单线程 每次链接一个用户node都不会创建一个新线程只会用一个;
  2. 非阻塞式(io) io 输入输出 阻塞式io:网络请求的时候,数据库操作的时候,文件读取的时候 非阻塞式io: node在访问高io操作的一些内容时 不会等待他的完成,而是继续后面的操作,当完成之后会通过回调函数进行返回 特点:保证高效运行当前线程,不会造成浪费。
  3. 事件驱动 通过事件驱动整个程序的进行。 由于node是单线程 所有把高io的操作,会移动到事件队列中进行等待完成。完成后就会通过回调函数进行处理(官方名字:事件环)

node擅长的应用:

  1. 高并发
  2. 高io密集型应用
    (如:聊天室、豆瓣的站内信、功夫熊app)

node不擅长 :

金融项目 银行项目 国家重要信息通信项目

node如何运行js:

  1. REPL 交互式解释器 可以在cmd中直接运行javascript;
    注意:如果你要写多行的话 结尾的内容必须要放在最后。

思考:

js传统运行方式:通过html来引入js来运行

node可以直接运行js

魔术变量 双底杠__

__filename 当前运行的js脚本的文件名(可以输出当前运行的这个文件在电脑硬盘中的绝对路径)

__dirname 当前运行的js脚本所在文件夹的路径(不包含文件名)

node中的模块

模块是什么:一个js我们就可以称之为一个模块(把一个逻辑中或者式一个功能点中的内容拆分到多个文件中js)把这些细小的js文件拼装成一个整体的过程就是模块化开发。

模块有两种:
  1. 自定义模块
    (1)暴漏(抛出) exports(返回的是模块化函数)或module.exports(模块本身)
    通常情况下都是使用module.exports(模块本身);
    (2)使用require()来引用;
  2. 内置模块
    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(“删除的文件路径”,回调);

  1. 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 人生还很长,认真的走下去。


小故事没找到,故事图也不错:

(我找来的图,原作者在图上)

NodeManager是什么意思 node是什么意思?_NodeManager是什么意思