Nodejs基础

29 篇文章 1 订阅
13 篇文章 0 订阅

一、node.js是什么

node.js基于谷歌的V8引擎,运行在服务器端的环境

二、JS和node.js的区别

JS运行在客户端浏览器中,有多个解释器,存在代码兼容性问题;
nodejs运行在服务器端,只有一种解释器,不存在代码兼容性问题
两者都有相同的对象 ,自定义对象,不同的宿主对象
JS运行开发浏览器的交互效果,node.js用于服务器端的开发,例如:数据库的访问,其它服务器的调用

三、使用node.js

node 拖拽文件 脚本模式
node 回车 交互模式

两次ctrl+c 或者 crtl+d 退出交互模式

四、node.js特点

nodejs属于单线程运行逻辑,支持数万个并发连接,适合做基于社交网络的大规模web应用

五、node.js对象

一、全局对象

1.global对象

可以查看一个变量或者函数是否为全局的,全局变量和全局函数都是全局对象
global下的,可以通过global访问;例如global.a global.fn()

练习

创建文件03_global.js 声明变量a,创建函数fn,使用global访问,查看有什么结果。

var a=1;
function fn(){
	return '找到你了';
}
console.log(global.a);//不是全局变量
console.log(global.fn());//不是全局变量

在node.js下,脚本文件不是在全局作用域下,防止了全局污染
JS的全局叫window
在js下,脚本文件不是在全局作用域下,防止了全局污染

2.console对象
  • console.log()&console.info() //打印日志 打印消息
  • console.warn()&console.error() //打印警告 打印错误

统计程序运行时间
开始计时和结束计时里面的参数要保持一致

  • console.time() 开始计时
  • console.timeEnd() 结束计时
console.time('while');
let x=1;
while(x<=100000){
	x++;
}
console.timeEnd('while');

console.time('dowhile');
let j=1;
do j++;
while(j<=100000){
	j++;
}
console.timeEnd('dowhile');

console.time('for');
for(let i=1;i<=100000;i++){
}
	console.timeEnd('for');
3.process对象
  • process.arch 查看当前cpu的架构
  • process.platform 查看当前操作系统版本
  • process version 查看当前nodejs的版本号
  • process pid 查看当前nodejs的进程编号
  • process kill(pid) 结束指定编号的进程
console.log(process.arch);
console.log(process.platform);
console.log(process.version);
4.buffer对象

缓冲区 缓冲器

buffer(n,string) 是内存中的区域,用于将临时存储数据,n为一次缓冲的字节大小,string要转的字符串

//创建buffer,存储数据
let buf=Buffer.alloc(9,'葫芦abc');//一个中文占三个字节,一个英文占一个字节
console.log(buf);//显示字符的编码,16进制
//将buffer数据转为字符串
console.log(buf.toString());
console.log(String(buf));

二、全局函数

1.定时器函数
1.一次性定时器

开启
let timer=setTimeout(回调函数,间隔时间)
当间隔时间到了,调用一次回调函数

清除
clearTimeout(timer);

//开启一次性定时器
let timer=setTimeout( function(){
	console.log('boom');
},3000 );//1.第1个参数回调函数 2.第2个参数延时时间
console.log('先吃一个煎饼');
clearTimeout(timer);//清除定时器
2.周期性定时器

开启
let timer=setInterval(回调函数,间隔时间)
每隔一次时间,调用一次回调函数

清除
clearInterval(timer);

//开启周期性定时器
let timer=setInterval( function(){
	console.log('牛皮广告真烦');
},2000);
//清除周期性定时器
clearInterval(timer);
3.立即执行的定时器

开启
setImmediate(timer)
清除
clearImmediate(timer)

console.log(2);
setImmediate( ()=>{
	console.log(1);
} );
console.log(3);
2
3
1

process.nextTick定时器比setImmediate早

console.log(2);
setImmediate( ()=>{
	console.log(1);
} );

process.nextTick( ()=>{
	console.log(4);
} );
console.log(3);
2
3
4
1

六、模块

  • 每一个模块是一个独立的功能体
  • 每一个文件就是一个模块
  • module.exports 当前模块导出的对象,默认是一个空对象,导出的内容需要添加到该对象
  • require() 是一个函数,用于引入其它的模块,得到导出的对象
1.模块
  • module 当前模块对象
  • module.exports 当前模块导出的对象
  • require() 引入另一个模块
  • __dirname 是一个局部变量,获取当前模块的绝对路径
  • __filename 是一个局部变量,获取当前模块的绝对路径和模块名称
2.模块分类
  • a.自定义模块
  • b 核心模块
  • c 第三方模块
以路径开头不以路径开头
文件形式require(’./circle.js’)
用于引入我自定义模块
require(‘url’)
引入官方提供的核心模块
目录模块require(’./02_ran’)
首先会到02_ran 目录中寻找祝英台age.json 文件中main属性对应的文件,如果找不到会自动寻找index.js
require(‘ran’)
首先到当前目录下的node_modules目录下寻找,如果找不到会一直往上一级的node_modules目录下建寻找,用于引入第三方模块
3.包和npm

包(package):就是一个目录模块
npm:用于管理包的工具模块,包括包的下载、升级、卸载、上传
CommonJS规范:Node.js遵循的规范,包、模块、都是遵循这个规范

包管理
1.初始化

下载包之前初始化

npm init -y
2.下载包

下载安装指定的包,会将包下载到当前目前下的node_modules中,如果node_modules不存在,会自动创建;会生成一个文件package-lock.json,用于记录安装的包的名称和版本号。同时会在package.json中添加刮版本号

npm install mysql

自动安装package.json和package-lock.json中记录的包

npm install

npm 可以选择不同的node.js版本来运行文件

npm -v
npx -v
npx -p node@版本号 node 文件名称 //执行下载相应node版本后执行相应文件
获取当前下载仓库的地址

淘宝镜像https://registry.npm.taobao.org/
npm官方地址https://registry.npmjs.org/

npm config get registry
更改仓库下载地址为淘宝镜像
npm config set registry https://registry.npm.taobao.org/
4.查询字符串模块(querystring)

查询字符串是浏览器端向服务器端传递数据的一种方式,位于URL中

查询字符串模块用于操作查询字符串的工具模块

  • parse() 将查询字符串解析为对象

练习
假设实现添加到购物车,需要通过查询字符串传递商品的编号(lid),用户的编号(uid),购买的数量(num),解析查询字符串获取传递的数据

//引入查询字符串模块
//decode方法
const querystring=require('querystring');
//查询字符串
let str='keyword=%E6%89%8B%E6%9C%BA&wq=%E6%89%8B%E6%9C%BA&ev=exbrand_%E5%8D%8E%E4%B8%BA%EF%BC%88HUAWEI%EF%BC%89%5E';
//使用查询字符串模块解析为对象
let obj=querystring.decode(str);
console.log(obj);
//parse方法
const querystring=require('querystring');

//查询字符串
let str='keyword=手机&uid=9&price=4999';
//使用查询字符串模块解析为对象
let obj=querystring.parse(str);
console.log(obj);


5.URL模块

URL:统一资源定位
https;//www.pythl.com:9999/product_11.html?lid=1
协议 域名/ip 端口 文件的路径 查询字符串

URL模块用于操作URL的工具模块

  • parse() 将URL解析为对象,可以得到各个部分
7.读取文件readFileSync

readFileSync(文件的路径)/readFile(文件的路径,回调函数)

8.删除文件unlinkSync/unlink

unlinkSync(文件的路径)/unlink(文件的路径,回调函数)

6.同步和异步

同步:会阻止后续代码执行,必须执行完当前的同步方法才能往生继续执行,通过返回值获取结果

const fs=require('fs');
//查看文件的状态
let stat=fs.statSync('./hah.docx');
//查看是否为文件形式
console.log(stat.isFile());
//查重是否为目录形式
console.log( stat.isDirectory() );

异步:不会阻止后续代码执行,在一个独立的线程执行,执行完以后会将结果以回调函数形式放入事件队列,通过回调函数获取结果。

const fs=require('fs');
//使用异步
let s=fs.stat('../0318',(err,s)=>{
	//err可能产生错误 每个异步都是有这个参数
	//s 执行成功的结果 不是每个都有这个参数
	if(err){
	throw err;
	}
	console.log(s);
});
console.log('执行完毕');
7.fs文件系统模块

文件包含目录形式和文件形式

1.创建目录mkdir/mkdirSync
const fs=require('fs');
fs.mkdirSync('./mydir');
2.移出目录rmdir/rmdirSync

只能移出空目录

const fs=require('fs');
fs.rmdirSync('./mydir');
3.查看文件状态 fs.stat/fs.statSync

statSync(路径)/stat(路径,回调函数)
回调函数

err 可能产生的错误
s 获取成功的结果

isFile() 检测是否为文件
isDirectory() 检测是否为目录

4.读取目录readdir/readdirSync

readdirSync(路径)/readdir(路径,回调函数)

回调函数

err 可能产生的错误
读取的结果,返回参数

const fs=require('fs');
//使用异步
let s=fs.readdir('../0318',(err,result)=>{
	//err可能产生错误 每个异步都是有这个参数
	//s 执行成功的结果 不是每个都有这个参数
	if(err) throw err;//如果if后面只有一行代码,省略{}
	console.log(result);
});
console.log('执行完毕');
//使用同步
const fs=require('fs');
let s=fs.readdirSync('../0318');
console.log(s)
console.log('执行完毕');
5.写入文件writeFile/writeFileSync

writeFileSync(路径,写入的数据)/writeFile(路径,写入的数据,回调函数)

如果文件不存在,会先创建文件然后写入数据
如果文件已经存在,会先清空文件中的内容然后写入数据

const fs=require('fs');
//异步写入文件
fs.writeFile('./1.txt',['然哥','大概'],(err)=>{
	if(err){
		throw err;
	}
})
console.log('写入成功');
const fs=require('fs');
//同步写入文件
fs.writeFileSync('./2.txt','然哥,大概');
console.log('写入成功');
6.追加写入appendFileSync

appendFileSync(路径,写入的数据)/appendFile(路径,写入的数据,回调函数)

如果文件不存在,会先创建文件然后写入数据
如果文件已经存在,会在文件的末尾追加写入数据

const fs=require('fs');
//异步写入文件
fs.appendFileSync('./2.txt','葫芦,hello',(err)=>{
	if(err){
		throw err;
	}
})
console.log('写入成功');
const fs=require('fs');
//同步写入文件
fs.appendFileSync('./2.txt','葫芦,hello');
console.log('写入成功');

练习:创建数组包含多个姓名,遍历得到每个姓名,使用异步方法追加写入数据 stu.txt

7.读取文件redeFileSync/readFile

读取文件redeFileSync(文件路径)/readFile(文件路径,回调函数)

const fs=require('fs');
//同步读取文件
let data=fs.readFileSync('./stu.txt');
console.log( data.toString() );
console.log('写入完成');
const fs=require('fs');
//异步读取文件
let data=fs.readFile('./stu.txt',(err,str)=>{
	if(err) throw err;
	console.log( str.toString() );
});
console.log('写入完成');
8.删除文件unlinkSync/unlink

unlinkSync(文件路径)/unlink(文件路径,回调函数)

9.判断文件、目录是否存在fs.existsSync

fs.existsSync(路径) 判断文件、目录是否存在

10.拷贝文件fs.copyFileSync

fs.existsSync(源路径名称,目标路径名称) 拷贝文件源路径和名称,拷贝后的路径和名称

11.流 stream
1.createReadStream() 创建可读取的文件流,数据分段读取

on(事件名称,回调函数) 添加事件,监听是否有数据流入

const fs=require('fs');
//创建可读取的文件流
let rs=fs.createReadStream('./1.zip');
//添加事件:监听是否有数据流入
//on(事件名称,回调函数)
//data 固定,表示一旦有数据流入,自动通过回调函数获取
let count=0;//用于打印次数
rs.on('data',(chunk)=>{
	//表示分段的数据
	//console.log( chunk );
	count++;

});
//添加读取结束事件
//一旦读取结束,调用回调函数
rs.on('end',()=>{
	console.log(count);
});
2.createWriteStream()创建可写入的文件流

pipe() 管道,用于将读取的文件流添加到写入的文件流

const fs=require('fs');
//创建可读取的文件流
let rs=fs.createReadStream('./1.zip');
//创建可读取的文件流
let ws=fs.createWriteStream('./2.zip');
//把读取的文件流通过管道添加到写入流
rs.pipe(ws);

七、http协议

http协议是浏览器和web服务器之间的通信协议

1.通用头信息

  • Request URL:要请求的资源
  • Request Method:请求的方法 get/post/delete/put…
  • Status Code:响应状态码

2.响应头信息

  • Location:要跳转的URL,通常会结合状态码3**使用
  • Content-Typer:响应的内容类型html对应 /text/html;charset=utf8

3.请示头信息

4.http模块

  • 参数

//rep 请求的对象
//res 响应的对象
//res.write() 设置响应的内容
//res.setHeader() 设置响应的状态码和头信息
//res.end() 结束并发送响应
//req.url 获取请求的rul
//req.method 获取的方法

const http=require('http');
//创建WEB服务器
const app=http.createServer();
//设置端口
app.listen(5555);
//接收请求,并作出响应
//事件:一旦请求服务器,自动调用回调函数;
app.on('request',(req,res)=>{
	//req请求 res响应 设置响应的内容
	res.write('你好,有什么事?');
	//结束并发送响应
	res.setHeader("Content-Type","text/html;charset=utf-8");
	res.end();
	
});
实战代码
  • 要求

创建WEB服务器设置端口;根据请求作出对应的响应
/login 响应 <h2>这是登录的内页</h2>
/index 响应 1.html文件,先同步读取文件数据,将数据作为响应的内容
/study 跳转到 网址
其它 响应 404 Not Found

//引入http fs模块
const http=require('http');
const fs=require('fs');
//创建web服务器
const app=http.createServer();
//设置端口
app.listen(5555);
//设置监听事件
app.on('request',(req,res)=>{
	let str=req.url;
	if(str==='/login'){
		res.setHeader(200,{"Content-Type":"text/html;charset=utf-8"});
		res.write('<h2>这是登录的内页</h2>');
	}else if(str==='/index'){
		let file=fs.readFileSync('./1.html');
		res.setHeader(200,{"Content-Type":"text/html;charset=utf-8"});
		res.write(file);
	}else if(str==='/study'){
		//设置状态码和跳转地址
		res.writeHead(302,{Location:'https://www.pythl.com'});
	}else{
		res.writeHead(404,'Content-Typer:text/html;charset=utf8')
		res.write('404,Not Found');
	};
	//结束并发送响应
	res.end();
});
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

晚生隆海

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值