以下是讲解nodejs的方向列表
一、Nodejs特点
二、Nodejs模块化
三、Nodejs异步回调
四、Nodejs爬虫
五、Nodejs中间件
一、Nodejs特点
- Node是单线程_不需要为每一个客户端连接创建新线程,当有用户连接了,就触发一个内部事件,通过非阻塞IO,让Nodejs程序宏观上并行
- 非阻塞I/O:Nodejs通过回调函数(Callback)和异步机制
- 异步、事件驱动模型,不管是新用户请求,还是老用户的IO完成,都将以事件方式加入事件环,等待调度
Nodejs适用于高并发,I/O密集,少量业务逻辑的场景
Nodejs中所有的IO都是异步的,回调函数,套回调函数。(与Java基础的形式有所不同,需要转换思想,Java本身是有什么返回值,然后方法调用的时候可以接受返回值)
二、Nodejs模块化
Nodejs大方向包含三种模块:内置模块、第三方模块、自定义模块(一个js文件一个模块)
内置模块:比方nodejs的path,就属于一个模块,使用方法:var path=require(‘path’);
第三方模块:一般采用npm i “需要的模块”,是需要下载依赖的模块的,下载之后,引入方法同上;
自定义模块:自己写的js并且抛出模块,下面是代码:
module.js
let name={
sayHello(){
console.log('你好');
}
}
module.exports=name
tets.js
let moduleTest=require('./module.js');
moduleTest.sayHello();
结果就是:打印出你好
三、Nodejs异步回调
Nodejs全部采用异步回调的形式
大量的异步操作,如果需要顺序执行,通过回调函数执行,但是这样会多层嵌套,导致回调地狱
可以通过promise解决回调地狱
假设需求,有1.txt 2.txt 3.txt三个文件,需要你顺序读取内容,并且将信息打印,当然,如果是Java基本写的方式实现,只需要封装一个函数,然后顺序调用即可。但是在nodejs中行不通,谨记,nodejs是异步的。
如果想顺序执行,最基础的方式如下,在回调函数中调用另一个的形式完成需求:
var fs=require('fs');
//第一个
fs.readFile('./1.txt',function(err,data){
if(err){
throw err;
}
console.log(data);
//第二个
fs.readFile('./2.txt',function (err,data) {
if(err){
throw err;
}
console.log(data);
//第三个
fs.readFile('./3.txt',function (err,data) {
if(err){
throw err;
}
console.log(data);
})
})
})
以上的方式实现就是典型的地狱回调,nodejs可以使用promise的方式组织地狱回调,代码如下:
var fs=require('fs');
function getFileDataByPath(filePath) {
return new Promise(function (resolve,reject) {
fs.readFile(filePath,function (err,data) {
if(err){
//失败,要执行失败的回调
reject(err);
}else{
//成功的逻辑
resolve(data);
}
})
})
}
getFileDataByPath('./1.txt').then(function (data) {
console.log(data);
return getFileDataByPath('./2.txt');
})//通过getFileDataByPath返回的是一个promise对象,可以继续.then串联调用(链式调用)
.then(function (data) {
console.log(data);
return getFileDataByPath('./3.txt');
}).then(function (data) {
console.log(data);
}).catch(function (err) {
//catch作用:上面所有的promise如果其中有1个错误,则终止下面所有的promise执行,直接进入catch捕获对应的异常错误信息
console.log(err);
}).finally(function () {
//无论成功或失败都会执行
console.log('完成');
})
ps:promise语法:
new promise(function(resolve,reject){…})
promise对象是一个代理对象(代理一个值),被代理的值在promise对象创建时可能是未知的。它允许你为异步操作的成功和失败分别绑定相应的处理方法。这让异步方法可以像同步方法那样返回值,但并不是立即返回最终执行结果,而是一个能代表未来出现的结果的promise对象
参考链接如下:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Promise
四、Nodejs爬虫
爬虫会拉取网站的请求并且获取有效信息
1、获取目标网站 http.get
2、分析网站内容,可以采用第三方模块cheerio,需要npm下载模块,相当于是jQuery中的选择器
cheerio.load()将一组HTML格式的字符串,转换为类DOM,之后可以通过jQuery的语法选中其中的元素
3、获取有效信息,下载或者其他操作
五、Nodejs中间件
中间件 middleewear
分类:内置中间件 static,自定义中间件(全局,局部),第三方中间件body-parser拦截器
中间件使用一定要注意next
场景:需要拦截所有的请求并且判断是否有token,没有token的话则返回缺少token,有的话则继续后续代码的执行
var express=require('express');
const app=express();
app.use('/',function (req,res,next) {
console.log('中间件');
let {token} =req.query
if(token){
next()
}else{
res.send('缺少token');
}
})
ps:如果在有token的时候,没有进行next(),那么整个的就执行不下去了