您的位置:首页 > Web前端 > Node.js

Node基础知识简介

2020-08-21 16:43 971 查看

Node

node简介

浏览器中的javascript不能做什么

  • +访问数据库
  • +不能对文件进行操作
  • +对os 进行操作
  • +原因 是不安全 和浏览器运行机制有关

语言解析平台

  • +java java虚拟机 (运行平台)

  • +php php虚拟机

  • +c# .net framework mono

  • +js 解析内核 chrome v8

    基于Chrome’s JavaScript runtime,也就是说,实际上它是对GoogleV8引擎(应用于Google Chrome浏览器)进行了封装. Node对一些特殊用例进行了优化,提供了替代的API,使得V8在非浏览器环境下运行得更好。例如,在服务器环境中,处理二进制数据通常是必不可少的,但Javascript对此支持不足,因此,V8.Node增加了Buffer类,方便并且高效地 处理二进制数据。因此,Node不仅仅简单的使用了V8,还对其进行了优化,使其在各环境下更加给力。

node的优点

  • 1、基于V8虚拟机,可构建高性能服务器

  • 2、单线程

  • 3、可利用Javascript进行后台开发

  • 4、非阻塞IO

    向文件系统发送一个请求时,无需等待硬盘(寻址并检索文件),硬盘准备好的时候非阻塞接口会通知Node。
  • 5、RESTful API

      REST全称是Representational State Transfer,中文意思是表述(编者注:通常译为表征)性状态转移。
      资源与URI
      统一资源接口
      资源的表述
      资源的链接
      状态的转移

    历史

    • 作者

      Ryan dahl
    • 2009 2 月份 node有想法
    • 2009 5 月份 github 开源
    • 2009 11月份 jsconf 讲解推广node
    • 2010年底 被xxx公司收购
    • 2018 发布有重大bug

    版本

    • 偶数版本为稳定版 (0.6.x ,0.8.x ,0.10.x)

    • 奇数版本为非稳定版(0.7.x ,0.9.x ,0.11.x)

    • 问题

      以前版本安装的很多全局的工具包需要重新安装
    • 无法回滚到之前的版本
    • 无法在多个版本之间切换(很多时候我们要使用特定版本)

    问题

    • Python环境丢失
    • Node中有些第三方的包是以C/C++源码的方式发布的,需要安装后编译,确保全局环境中可以使用python命令,python 版本推荐2.7.0
    • 环境变量丢失
    • 部分电脑安装完毕之后没有环境变量需要手动配置
    • Windows中环境变量分为系统变量和用户变量
    • 环境变量的变量名是不区分大小写的
    • PATH 变量:只要添加到 PATH 变量中的路径,都可以在任何目录下
    • 目的可以在任何地方调起node命令

    node版本切换工具

    • nvm

    • 安装

      https://github.com/coreybutler/nvm-windows/releases
  • nvm安装node版本

      nvm install v12.16.3
    • nvm install v10.12
  • nvm卸载node版本

      nvm uninstall v12.16.3
    • nvm uninstall v10.12
  • nvm查看版本

      nvm list
  • nvm使用修改当前版本

      nvm use v10.12

    npm下载源切换工具nrm

    • nrm

    • 安装arm

      npm i nrm -g
  • 显示下载源列表

      nrm ls
  • 切换使用对应的下载源

      nrm use taobao
  • 测试下载源速度

      nrm test taobao

    node和mySQL

    下载mySQL模块

    • npm i mysql

    引入mySQL模块

    • var sql=require(“mysql”)

    连接mySQL数据库

    • var db=sql.createConnection({
      url:“localhost”,
      port:3306,
      user:“root”,
      password:“root”,
      database:“game”
      });

    判断连接是否成功

    • db.connect(function(err){
      if(err){
      console.log(“连接失败”);
      return;
      }else{
      console.log(“连接成功”);
      }
      })

    查询语句

    • let sql = “select * from user”;
      db.query(sql,function(err,res){
      console.log(err,res);
      })

    添加数据

    • let sql=“INSERT INTO
      user
      (
      user
      ,
      password
      ,
      name
      ,
      age
      ,
      sex
      ,
      tel
      ,
      email
      ) VALUES (?,?,?,?,?,?,?)”;
      db.query(sql,[“xietian0987”,“xie123456”,“谢天123”,40,“男”,“18510321568”,“10398975@qq.com”],function(error,res){
      console.log(res);
      })

    express模块

    安装

    • npm i express

    引入

    • var express=require(“express”);

    创建app

    • var app=express();

    创建get接收

    • app.get("/test1",function(req,res){

    });
    app.get("/test2",function(req,res){

    });

    • req.query获取请求的数据
    • res.send(任何类型)
    • res.end(字符串或者二进制)
    • res.set(“Access-Control-Allow-Origin”,"*");设置跨域请求
    • res.header() 设置头

    创建中间件

    • app.use("/",function(req,res,next){

    })

    - app.use((req,res,next)=>{
    next();

    })
    - 简写

    • 中间件的目的是为了做一个全局的拦截,开始的时候就对数据做好处理,然后再继续传递

      res.set("Access-Control-Allow-Origin","*");
    • 例如需要设置跨域
  • 设置静态路径

      路径模块引入

      var path=require(“path”);
  • 设置静态路径

      app.use(express.static(path.join(__dirname,"./abc")));
  • 例如当前目录有个abc文件夹下面的a.txt

      http://localhost:8000/a.txt
  • next()方法向后执行对应的接口

  • app.all() 任何请求不管get还是post的中间件

  • 创建post接收

    • app.post("/test1",function(req,res){

    });
    app.post("/test2",function(req,res){

    });

    • req.body获取请求的数据

    • res.send(任何类型)

    • res.end(字符串或者二进制)

    • res.set(“Access-Control-Allow-Origin”,"*");设置跨域请求

    • 第三方中间件bodyParser

      目的是解决客户都发送到服务端数据的格式问题

    • var parser=require(“body-parser”)下载安装express时会自动下载第三方body-parser插件

    • 例如表单数据的发送需要使用application/x-www-form-urlencoded

    • 默认情况下表单POST发送是application/x-www-form-urlencoded类型,因此需要设置

      app.use(parser.urlencoded({extended:false}));

    • extended:true

      表示使用第三方模块qs来处理
  • extended:false

      表示使用系统模块querystring来处理,也是官方推荐的
  • 默认情况下ajax发送POST是文本类型的

      app.use(parser.text())
  • bodyParser.json()–解析JSON格式

  • bodyParser.raw()–解析二进制格式

  • 第三方解析模块connect-multiparty

      目的是解析表单数据form-data,当前端发来formData数据时可以解析
    • npm i connect-multiparty
    • 引入var multi=require(“connect-multiparty”);
    • app.post("/test1",multi(),function(req,res){
      console.log(req.body);
      res.send(“aaa”);
      })

    cors模块

    • 解决cors跨域
    • npm i cors
    • 引入 var cors=require(“cors”);
    • app.all(cors());

    express路由

    • 设置主文件

      var express=require(“express”);
      var app=express();
      app.use("/",function(req,res,next){
      res.set(“Access-Control-Allow-Origin”,"*");
      next();
      })
  • 添加模块文件

      在当前目录下新建a文件夹,新建a1.js

      引入express

      var express=require(“express”);
  • 获取路由

      var router=express.Router();
  • 设置该模块的接口内容

      router.get("/add",function(req,res){
      console.log(req.query);
      res.send(“a1 add”)
      });
      router.get("/del",function(req,res){
      console.log(req.query);
      res.send(“a1 del”)
      });
  • 导出模块

      module.exports=router
  • 在主文件中分配路由模块

      app.use("/a",require("./a/a1"));

    Node的API

    url

    • var url=require(“url”);

    • URL类

      var myUrl=new URL(“http://10.9.63.202:3005?name=xie”)
  • url.parse

      url.parse(urlString)
    • 解析 URL 字符串并返回 URL 对象。
  • url.format

      url.format(urlObject)
    • 方法返回一个从 urlObject 格式化后的 URL 字符串。
    • var myUrl=new URL(“http://10.9.63.202:3005?name=xie”);
      url.format(myUrl);
      //“http://10.9.63.202:3005?name=xie”
  • url.resolve

      方法会以一种 Web 浏览器解析超链接的方式把一个目标 URL 解析成相对于一个基础 URL。
    • url.resolve(“http://www.163.com/news”,“beijing”);
      //http://www.163.com/beijing

    url.resolve(“http://www.163.com/news/”,“beijing”);
    //http://www.163.com/news/beijing

    querystring

    • var querystring=require(“querystring”);

    • querystring.escape

      转化为URL 百分比编码。
    • console.log(querystring.escape(“http://10.9.63.202:3005?name=xie”));
      //http%3A%2F%2F10.9.63.202%3A3005%3Fname%3Dxie
  • querystring.unescape

      将URL百分比编码格式转换为字符串
    • .console.log(querystring.unescape(“http%3A%2F%2F10.9.63.202%3A3005%3Fname%3Dxie”));
      //http://10.9.63.202:3005?name=xie
  • querystring.parse

      将url中使用&连接的字符格式转换为对象
    • console.log(querystring.parese(“foo=bar&abc=xyz&abc=123”));
      //
      // {
      // foo: ‘bar’,
      // abc: [‘xyz’, ‘123’]
      // }
  • querystring.stringify

      将对象或者数组转换为使用&连接的字符串
    • console.log(querystring.stringify({ foo: ‘bar’, baz: [‘qux’, ‘quux’], corge: ‘’ }));
      //‘foo=bar&baz=qux&baz=quux&corge=’

    http

    • var http=require(“http”);

    • http.createServer()

      通过http创建一个服务对象,返回http.Server类的实例化对象
    • var http=require(“http”);
      var server=http.createServer(function(req,res){

    });

    server.listen(3006,“10.9.63.202”,function(){

    })

    • http.get()

      由于大多数请求都是没有主体的 GET 请求,这里就写了一个简易的get请求
    • 主要用于请求远程服务的文件.例如http://10.9.63.202:8000/server/config.json
    • res.setEncoding(“utf8”);
    • var server=http.get(“http://10.9.63.202:8000/server/config.json”,function(res){
      if(res.statusCode!==200){
      console.log(“请求失败”);
      res.resume();//消耗响应数据释放内存
      return;
      }
      res.setEncoding(“utf8”);
      var data="";
      res.on(“data”,function(_data){
      data+=_data;
      });
      res.on(“end”,function(){
      console.log(JSON.parse(data));
      })
      });

    event事件

    • var EventEmitter=require(“events”);

    • 事件侦听和事件触发

      创建事件继承EventsEmitter

      class ChangeEvent extends EventEmitter{
      constructor(){
      super();
      }
      static get EVENT_ID(){
      return “Event”
      }
      }
  • 先侦听事件

      var changeEvent=new ChangeEvent();
      changeEvent.on(ChangeEvent.EVENT_ID,function(){
      console.log(“aaa”);
      });
  • 事件触发

      changeEvent.emit(ChangeEvent.EVENT_ID);
  • 事件传参触发

      var changeEvent=new ChangeEvent();
      changeEvent.on(ChangeEvent.EVENT_ID,function(a,b){
      console.log(a+b);
      });
      changeEvent.emit(ChangeEvent.EVENT_ID,3,4);
  • this的指向

      this指向changeEvent对象
  • once

      仅触发一次
    • var changeEvent=new ChangeEvent();
      changeEvent.once(ChangeEvent.EVENT_ID,function(){
      console.log("aaa);
      });
      changeEvent.emit(ChangeEvent.EVENT_ID);
      changeEvent.emit(ChangeEvent.EVENT_ID);
  • off

      删除事件
    • changeEvent.off(ChangeEvent.EVENT_ID);
  • 异步执行方法

      setImmediate

      var changeEvent=new ChangeEvent();
      changeEvent.on(ChangeEvent.EVENT_ID,function(a,b){
      console.log(“b”);
      setImmediate(function(){
      console.log(“a”)
      });
      console.log(“c”);
      });
      changeEvent.emit(ChangeEvent.EVENT_ID,3,4);
  • process.nextTick

      var changeEvent=new ChangeEvent();
      changeEvent.on(ChangeEvent.EVENT_ID,function(a,b){
      console.log(“b”);
      process.nextTick(function(){
      console.log(“a”);
      })
      console.log(“c”);
      });
      changeEvent.emit(ChangeEvent.EVENT_ID,3,4);

    path模块

    • var path = require(‘path’);

    • path.join

      方法使用平台特定的分隔符作为定界符将所有给定的 path 片段连接在一起,然后规范化生成的路径。
    • var str=path.join(’/foo’, ‘bar’, ‘baz/asdf’);
      console.log(str);
  • path.basename

      返回路径中最后的部分,可以去掉扩展名
    • var str=path.join(’/foo’, ‘bar’, ‘baz/asdf.txt’);
      console.log(path.basename(str));
      console.log(path.basename(str,".txt"))
  • path.dirname

      返回路径中目录名
    • var str=path.join(’/foo’, ‘bar’, ‘baz/asdf.txt’);
      console.log(path.dirname(str));
  • path.extname

      返回路径中的扩展名
    • var str=path.join(’/foo’, ‘bar’, ‘baz/asdf.txt’);
      console.log(path.extname(str));
  • path.parse

      将字符串对象转换为对象
    • var str=path.join(’/foo’, ‘bar’, ‘baz/asdf.txt’);
      console.log(path.parse(str));
  • path.format

      将path对象转换为字符串
    • var str=path.join(’/foo’, ‘bar’, ‘baz/asdf.txt’);
      var obj=path.parse(str);
      console.log(path.format(obj))

    fs文件

    • readFile

      异步读取文件

      注意地址中会有转义字符,所以\使用的时候要多敲一个
  • var fs=require(“fs”);
    fs.readFile(“E:\test\test10\server\config.json”,“utf8”,function(err,data){
    console.log(err);
    console.log(data.toString());
    })

  • readFileSync

      同步读取文件
    • var fs=require(“fs”);
      var data=fs.readFileSync(“E:\test\test10\server\config.json”,“utf8”);
      console.log(data.toString());
  • createReadStream

      读取流模式
    • var fs=require(“fs”);
      var stream=fs.createReadStream(“E:\test\test10\server\config.json”);
      var data="";
      stream.on(“data”,function(_data){
      data+=_data;
      });
      stream.on(“end”,function(){
      console.log(data);
      })
  • readline

      var readline=require(“readline”);
    • 逐行读取文本内容
    • var fs=require(“fs”);
      var readline=require(“readline”);
      var rl=readline.createInterface(fs.createReadStream("./server/data/a.txt"));
      rl.on(“line”,function(line){
      console.log(line);
      })
  • statSync

      对象提供有关文件的信息

    • var stats=fs.statSync(path);

    • stats.isFile()

      判断当前路径的是不是文件
  • readdir

      异步读取文件的内容.回调有两个参数 (err, files),其中 files 是目录中的文件名的数组(不包括 ‘.’ 和 ‘…’)。
    • fs.readdir(path,function(error,files){
      //files是一个数组,里面包含了当前路径下所有的文件和文件夹名称
      })
  • readdirSync

      同步读取路径当中的内容
    • var files=fs.readdirSync(path);
  • writeFile

      异步地将数据写入到一个文件,如果文件已存在则覆盖该文件。 data 可以是字符串或 buffer。
    • fs.writeFile(‘a.txt’, ‘文本内容’, ‘utf8’, function(){
      });
  • writeFileSync

      异步写入文件
    • fs.writeFileSync(‘c:\demo\a.txt’, “文本内容”);
  • createWriteStream

      流式写入,如果是大文件,内容较多,例如视频等就需要流式写入,防止内存卡死
    • var streamWriter = fs.createWriteStream(‘c:\demo\a.txt’);
      setInterval(function(){
      streamWriter.write(
      ${new Date}\n
      , (error) => {
      console.log(error);
      });
      },1000)
  • appendFile

      向文件尾部增加新数据,如果该文件不存在就会创建一个新文件
    • fs.appendFile("./server/data/a.txt",“新增的内容”,function(error){
      console.log(error);
      })
  • appendFileSync

      同步向文件尾部增加新内容
    • try{
      fs.appendFileSync("./server/data/a.txt",“新增内容”);
      }catch(e){

    }

    stream流

    第三方模块

    requset请求

    cheerio 爬虫模块

    爬虫

    • 需要cheerio抓取页面数据模块 npm i cheerio
    • 需要request模块 服务端向服务端发起请求的模块 npm i request
    • var http=require(“http”);
      var https=require(“https”);
      var cheerio=require(“cheerio”);
      var rq=require(“request”);
      var fs=require(“fs”);
      var url=“http://news.baidu.com”;
      getpage(url)
      function getpage(url,title){
      var h;
      if(url.slice(0,5)===“https”){
      h=https;
      }else{
      h=http;
      }
      h.get(url,function(res){
      res.setEncoding(“utf8”);
      var data="";
      res.on(“data”,function(_data){
      data+=_data;
      });
      res.on(“end”,function(){
      var KaTeX parse error: Expected '}', got 'EOF' at end of input: … getNews();
      return;
      }
      saveImg($,title)
      })
      })
      }

    function getNews($){
    KaTeX parse error: Expected 'EOF', got '#' at position 3: ("#̲pane-news a").e…(item).attr(“href”);
    var title=$(item).text().trim();
    title=title.length>6 ? title.slice(0,6) : title;
    title=title[title.length-1]==="?" ? title.slice(0,-1) : title;
    getpage(src,title);
    rq(src).pipe(fs.createWriteStream("./server/data/"+title+".htm"));
    })
    }

    function saveImg($,title){
    $(‘img’).each(function (index, item) {
    var img_title = $(this).parent().next().text().trim();
    if(img_title.length>20||img_title=="") img_title=“Null”;

    var imgSrc = $(this).attr('src');
    var names=imgSrc.match(/.jpg|.png|.jpeg/);
    console.log(names);
    if(!names) return;
    var bool=false;
    rq.head(imgSrc,function(error){
    if(error){
    console.log(error);
    bool=true;
    }
    });
    if(bool) return;
    rq(imgSrc).pipe(fs.createWriteStream("./server/img/"+title+"----"+img_title+names[0]));
    });

    }

    代理跨域

    XMind: ZEN - Trial Version

  • 内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
    标签: