Node基础知识简介

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值