什么是NodeJS
- 1.Node.js官网地址:https://nodejs.org/en/
- 中文:http://nodejs.cn/api/
- 1.Node 是一个构建于 Chrome V8引擎(编译器)之上的一个Javascript 运行环境
- Node是一个
运行环境
,作用是让js拥有开发服务端的功能
- Node是一个
- 2.Node使用事件驱动、非阻塞IO模型(异步读写)使得它非常的轻量级和高效
- Node中绝大多数API都是异步(类似于ajax),目的是提高性能
- 3.Node中的NPM是世界上最大的开源库生态系统(类似于github)
- NMP官网:https://www.npmjs.com
- 4.Node运行环境的另一种叫法,作用是解析执行js代码(Node.exe工作环境称之为REPL环境)
- 5 .
nodemon
- node开发之友,当你的js文件发生变化的时候,nodemon会自动帮你启动node程序
- 安装: npm install -g nodemon
- 使用:nodemon [js文件名]
NodeJS模块化
模块:其实就是前端的第三方库(别人写的js文件)
内置模块/核心模块
:nodejs作者自己写的模块
第三方模块:热心网友写的模块
核心模块
nodejs模块的使用方法:
- 1.导包(下载):得到一个对象,存储框架中的API
require('模块路径');
- 2.用包:调用对象的方法
fs文件读取模块
- readFile读取文件
1.导入模块
(1)参数
: 模块路径 (2)返回值
: 对象 , 存储模块所有的api
const fs = require('fs');
- 使用模块
/**
* @description:
* @param {string} path:文件路径
* @param {string} option:可选参数 文件编码默认二进制 utf-8:中文
* @param {function} callback:读取回调 (err,data)=>{err:错误信息 data:读取数据}
* @return:
*/
fs.readFile('./a.txt','utf-8',function(err,data){
if(err){
// 抛出异常:程序终止运行,并且会告诉你报错的原因和具体的行数
throw err;
// console.log(err);
// console.log('读取失败');
// 成功,err就是null,data就是文件数据
}else{
console.log('读取成功');
console.log(data);
}
});
- writeFile写入文件
// 1.导入模块
const fs = require('fs');
//2. 使用模块
/**
* @description:写入文件
* @param {string} path :文件路径
* @param {string} data :要写入的数据
* @param {string} option :文件编码 自动根据数据识别,一般不用传
* @param {function} callback : 写入回调(err)=>{err:错误信息}
* @return:
*/
fs.writeFile('./b.txt','helloworld',err=>{
if(err){
throw err;
}else{
console.log('写入成功');
}
})
- 同步与异步的区别
- 编译器执行代码流程
- 从上往下解析代码
- 判断代码是同步还是异步
同步:立即执行
异步:不执行,放入一个事件队列池(EventLoop)
- 同步与异步的区别
- API不同,异步有回调函数,同步一般没有(前端有两个API是异步,定时器和ajax)
- 执行顺序不同,
同步有序
且优先执行,异步
是无序执行
- 性能不同,异步性能高(不能阻塞线程),同步阻塞线程
/*
1.编译器执行代码流程
1.1 从上往下解析代码
1.2 判断代码是同步还是异步
同步:立即执行
异步:不执行,放入一个事件队列池(EventLoop)
1.3 当页面所有同步执行完毕之后,才会执行事件队列池中的代码
2.同步与异步区别
2.1 API不同,异步有回调函数,同步一般没有
* 前端有两个API是异步,定时器和ajax
2.2 执行顺序不同,同步有序且优先执行,异步是无序执行
2.3 性能不同,异步性能高(不能阻塞线程),同步阻塞线程
*/
// 导入模块
const fs = require('fs');
/*
异步api的特点:
1.有回调函数
2.无序执行
3.不阻塞线程:性能高
*/
fs.readFile('./a.txt', 'utf-8', (err,data)=> {
console.log(11111);
});
fs.readFile('./a.txt', 'utf-8', (err,data)=> {
console.log(22222);
});
fs.readFile('./a.txt', 'utf-8', (err,data)=> {
console.log(33333);
});
fs.readFile('./a.txt', 'utf-8', (err,data)=> {
console.log(44444);
});
/*
// nodejs中所有的api都是异步的,如果希望同步就会在后面加上sync即可
同步的特点:
1.没有回调
2.有序
3.阻塞线程:性能低
*/
let data1 = fs.readFileSync('./b.txt','utf-8');
console.log('55555');
let data2 = fs.readFileSync('./b.txt','utf-8');
console.log('666666');
let data3 = fs.readFileSync('./b.txt','utf-8');
console.log('777777');
let data4 = fs.readFileSync('./b.txt','utf-8');
console.log('8888888');
path路径模块
- NodeJS中的相对路径与绝对路径
- 前端相对路径 ./ :相当于当前文件所在的文件夹
- nodejs相对路径 ./:相对于执行node命令所在的文件夹
- 在node中,每个js文件都有两个全局变量
- __dirname:
当前js文件所在的文件夹绝对路径
- __filename:当前文件本身的绝对路径
- __dirname:
- path路径模块作用
作用和自己拼接差不多,但是容错率更高- 自动识别当前操作系统的磁盘分隔符,会自动添加
- 纠错功能:如果磁盘分隔符写错了,path模块会自动纠正
// 导入path模块
const path = require('path');
let aPath = `${__dirname}/a.txt`;
console.log(aPath);
let bPath = path.join(__dirname, '\\/data', '///\\a.txt');
console.log(bPath);
// 1.导入模块
// (1)参数: 模块路径 (2)返回值:对象,储存模块所有的api
const fs = require('fs');
// (2)使用模块
fs.readFile(aPath, 'utf-8', (err, data)=> {
if (err) throw err;
console.log(data);//测试
});
http服务器模块
- http模块搭建服务器
- 导入模块
- 创建服务器
- 打开服务器
// 1.导入模块(相当于安装phpstudy软件)
const http = require('http')
// 2.创建服务器(相当于运行phpstudy打开一个窗口)
let server = http.createServer((req,res)=>{
// 监听客户请求的回调函数:每收到一次客户请求,就会调用一次(类似于事件触发)
// req:请求对象,负责获取客户端的请求信息 res:响应对象。负责响应客户端的数据的
console.log(req.url);
// 了解即可:url中文会被进行urlencode转码
console.log(decodeURI(req.url));
});
// 3.打开服务器(相当于点击phpstudy的开启按钮)
/**
* @description:
* @param {type} post:端口号 :系统给每一个应用程序一个编号,称之为端口号
* 默认就是本机ip
* @param {type} hostname :主机名(ip地址) 每一台计算机网络唯一身份标识符(人的身份证号)
* @param {type} callback: 开启服务器
* @return:
*/
server.listen(3000,()=>{
console.log('服务器开启成功');
});
- http模块响应请求
注意:
- end()参数只能是两种类型
字符串
和二进制
- 如果想要响应对象,需要转成
json格式字符串
// 1.导入模块
const http = require('http');
// 2.创建服务器
let server = http.createServer((req, res) => {
// req:请求对象
console.log(req.url);
// res:响应对象
// 注意点 end()参数只能是两种类型 字符串 | 二进制
// 如果想要响应对象,需要转成json格式字符串 JS->JSON.stringify()
res.writeHead(200, {
'Content-Type': 'text/html;charset=utf8',
}); //text/html文本});
res.end(JSON.stringify({ name: '二傻子', age: 20 }));
});
// 3.开启服务器
server.listen(3000, () => {
console.log('服务器开启成功');
});
- http模块根据不同的请求响应不同的数据
- http模块响应html文件
需求:
(1)请求路径为首页 : / . 响应:index.html
(2)请求路径为: /login 响应: login.html
(3)请求路径为: /list 响应: list.html
(4)其他路径 : 响应: 404.html
// 1.导入模块
const http = require('http');
const fs = require('fs');
const path = require('path');
// 2.创建服务器
let server = http.createServer((req, res) => {
// (1)请求:req
console.log(req.url);
// (2)处理:根据不同的请求响应不同的数据
if (req.url == '/') {
// 响应:index.html
// fs模块读取文件
fs.readFile(
path.join(__dirname, 'www', 'index.html', (err, data) => {
if (err) throw err;
// (3)响应
res.end(data);
})
);
} else if (req.url == '/login') {
//响应login
// fs模块读取文件
fs.readFile(
path.join(__dirname, 'www', 'login.html', (err, data) => {
if (err) throw err;
// (3)响应
res.end(data);
})
);
} else if (req.url == '/list') {
// 响应 :list.html
fs.readFile(
path.join(__dirname, 'www', (err, data) => {
if (err) throw err;
// 响应
res.end(data);
})
);
} else {
fs.readFile(
path.join(__dirname, 'www', '/404.html', (err, data) => {
if (err) throw err;
res.end(data);
})
);
}
// 3.开启服务器
server.listen(3000,()=>{
console.log('服务器成功开启');
})
});