Nodejs入门思想

以下是讲解nodejs的方向列表
一、Nodejs特点
二、Nodejs模块化
三、Nodejs异步回调
四、Nodejs爬虫
五、Nodejs中间件

一、Nodejs特点

  1. Node是单线程_不需要为每一个客户端连接创建新线程,当有用户连接了,就触发一个内部事件,通过非阻塞IO,让Nodejs程序宏观上并行
  2. 非阻塞I/O:Nodejs通过回调函数(Callback)异步机制
  3. 异步、事件驱动模型,不管是新用户请求,还是老用户的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(),那么整个的就执行不下去了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章