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卸载node版本
-
nvm uninstall v12.16.3
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数据时可以解析
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.format
-
url.format(urlObject)
url.format(myUrl);
//“http://10.9.63.202:3005?name=xie”
url.resolve
-
方法会以一种 Web 浏览器解析超链接的方式把一个目标 URL 解析成相对于一个基础 URL。
//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百分比编码格式转换为字符串
//http://10.9.63.202:3005?name=xie
querystring.parse
-
将url中使用&连接的字符格式转换为对象
//
// {
// foo: ‘bar’,
// abc: [‘xyz’, ‘123’]
// }
querystring.stringify
-
将对象或者数组转换为使用&连接的字符串
//‘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
-
仅触发一次
changeEvent.once(ChangeEvent.EVENT_ID,function(){
console.log("aaa);
});
changeEvent.emit(ChangeEvent.EVENT_ID);
changeEvent.emit(ChangeEvent.EVENT_ID);
off
-
删除事件
异步执行方法
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
-
返回路径中最后的部分,可以去掉扩展名
console.log(path.basename(str));
console.log(path.basename(str,".txt"))
path.dirname
-
返回路径中目录名
console.log(path.dirname(str));
path.extname
-
返回路径中的扩展名
console.log(path.extname(str));
path.parse
-
将字符串对象转换为对象
console.log(path.parse(str));
path.format
-
将path对象转换为字符串
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 data=fs.readFileSync(“E:\test\test10\server\config.json”,“utf8”);
console.log(data.toString());
createReadStream
-
读取流模式
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 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 是目录中的文件名的数组(不包括 ‘.’ 和 ‘…’)。
//files是一个数组,里面包含了当前路径下所有的文件和文件夹名称
})
readdirSync
-
同步读取路径当中的内容
writeFile
-
异步地将数据写入到一个文件,如果文件已存在则覆盖该文件。 data 可以是字符串或 buffer。
});
writeFileSync
-
异步写入文件
createWriteStream
-
流式写入,如果是大文件,内容较多,例如视频等就需要流式写入,防止内存卡死
setInterval(function(){
streamWriter.write(
${new Date}\n, (error) => {
console.log(error);
});
},1000)
appendFile
-
向文件尾部增加新数据,如果该文件不存在就会创建一个新文件
console.log(error);
})
appendFileSync
-
同步向文件尾部增加新内容
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
- Node.js基础知识简介
- 数字视频基础知识简介
- [ios][opengles]OpenGL ES基础知识简介
- Spark总结(简介 算子 基础知识)
- Android四大组件简介:Android 基础知识,开发教程
- Node.js基础知识
- Node.js(基础知识三)
- 计算机的基础知识(计算机简介)
- java基础知识简介
- Java基础知识-1、java简介
- Node.js学习--基础知识(7)--fs
- (转)opentsdb查询的简介————基础知识和UI操作
- 基础知识 - 字符编码简介
- C语言基础知识【简介】
- Email基础知识: SMTP/POP3 命令简介
- OpenGL ES学习总结:基础知识简介
- Android基础知识全面简介
- Node.js(基础知识二)
- SQL Server 索引基础知识(10)----Joins 时的三种算法简介
- memcached系列之1:memcached基础知识简介(为什么要使用memcached做缓存服务器)