1.1下载node.js
-
1.Node.js官网地址:Node.js
-
2.如何确认当前电脑是否已经安装了Node环境
-
打开终端,输入
node -v
,如果能看到版本号则说明当前电脑已经安装Node环境,如果提示Node不是内部或外部命令
,则表示未安装-
一旦安装了node,则会自动一并安装
npm
-
3.nodemon
-
node开发之友,当你的js文件发生变化的时候,nodemon会自动帮你启动node程序
-
-
安装:
npm install -g nodemon
-
使用:
nodemon [js文件名]
-
-
1.2 node.js运行环境执行js的三种方法
1.原理 打开安装的node.js运行环境执行js
直接输入代码
2.打开电脑终端cmd,执行命令:node[js文件名]
3.vscode:点击右键选择中断打开 输入node 文件名
要在js文件的位置打开集成终端
node 01 tab
1.
1.3-服务端(后端)js与客户端(前端)js区别
-
1.客户端JS由三部分组成
-
ECMAScript:确定js的语法规范
-
DOM:js操作网页内容
-
BOM:js操作浏览器窗口
-
-
2.服务端JS只有ECMAScript
-
因为服务端是没有界面的
-
==在nodejs中使用dom与bom的api程序会报错==
-
-
2 -fs模块
2.1 -fs模块读取文件readFile.js
// (1)导入模板
const fs=require('fs')
// 使用方法
// 同步 :在方法后面加上Sync(node.js中很少使用)
// 第一个参数 文件路径 第二个参数:文件编码 默认二进制 中文utf8
// let data=fs.readFileSync('./data/aaa.txt','utf8')
// console.log(data);
// node.js中所有的方法默认都是异步的
fs.readFile
/**
* @description:读取文件
* @param {string} path文件路径
* @param {string} encoding文件编码
* @param {function} 异步回调 callback(err,data)
* @return:
*/
fs.readFile('./data/aaa.txt','utf8',(err,data)=>{
if(err){
throw err
}else{
console.log('读取成功');
console.log(data)
}
})
2.2写入文件fs.write
// 1.导入模块
const fs =require('fs')
// 2.使用模块
/**
* @description:读取文件
* @param {string} path文件路径
* @param {data} 要写入的数据
* @param {option}:文件编码,一般不写,node.js会根据data自动识别
* @param {function} err=>{}
* @return:
*/
fs.writeFile('./data/bbb.txt','黑马程序员',err=>{
if(err){
throw err
}else{
console.log('写入成功');
}
})
2.3 同步与异步
fs.readFile(),异步无序 不立即执行
fs.readFileSync() 同步有序 从上往下执行 同步代码会立即执行
1.js编译器解析流程
1.编译器从上往下依次'解析'代码
2.判断代码是同步还是异步
2.1同步代码:立即执行
2.2异步代码:不立即'执行',而是放入事件队列中
3.所有的代码指向完毕后,才会执行异步代码
2.同步与异步区别
(1) 顺序不同 ,异步无序,同步有序且优先执行
(2)效率不同异步不会阻塞线程(效率高),同步会阻塞线程(效率低)
(3)代码不同 :一步一般有回调,同步一般没有回调
// 导入模块
const fs=require('fs')
fs.readFile('./data/aaa.txt','utf-8',(err,data)=>{
if(err){
throw err
}else{
console.log(222);
}
})
// 同步
fs.readFileSync('./data/bbb.txt')
console.log(444);
结果 :
2.4 try-catch捕捉异常
同步代码本身无法报错, fs.readFileSync('./aaa')
console.log(111) 可以通过try-catch捕获异常
try{
需要执行的同步代码
}.catch(err){
throw err
//抛出异常}
try{
let data=fs.readFileSync('./data/aaa.txt')
console.log(data)
}.catch(err){
throw err
}
2.5 path模块
2.51 nodejs相对路径
1.前端相对路径./与 后端的node.js相对./ 是不同的规则
前端 ./ :固定的 ,永远相对于当前文件所在的路径.
后端 ./ :不固定,相对于执行node命令所在的文件夹路径
*你在哪里执行node, ./就是哪个文件夹
2. node.js中文件读写,不能使用相对路径 ./ ,而应该用绝对路径
解决方案 : node环境中,每一个js模块默认有两个全局变量,用于获取文件绝对路径.
__dirname :当前js模块所在文件夹的绝对路径
__filename :当前js模块自身的绝对路径
//导入模块
const fs=require('fs')
console.log(__dirname)///前端的
console.log(__filename)
//读取数据
fs.readFile(__dirname+'/aaa.txt','utf8',(err,data)=>{
if(err){
throw err
}else{
console.log(data)
}
})
2.52 path模块拼接路径js
//导入path模块
const path=require('path')
//使用模块
/* 拼接文件 如果文件名写错,path模块会自动帮你纠正*/
let path1=__dirname+'/aaa.txt'
console.log(path1)
let path2=path.join(__dirname,'/aaa.txt')
console.log(path2)
04 http模块
4.1http模块搭建服务器
1.导入http模块
const http=require('http')
2.创建服务器
const app=http.creatServer((req,res)=>{
//(1) 请求:req
console.log(req.url)
//解析中文
console.log(decodeURI(req,url))
})
3.开启服务器
app.listen(3000,'127.0.0.1',()=>{
console.log('服务器开启成功')
})
// 导入http模块
const http=require('http')
// 2.创建服务器(运行软件)
/*
req :request 请求报文 (请求行,请求头,请求体)
res.response 响应报文(响应行,响应头,响应体)
回调执行条件 :客户端给服务器发送请求的时候会执行(发一个请求,就执行一次,会执行多次)
*/
const app=http.createServer((req,res)=>{
// (1)请求 :req
console.log(req.url);
// 当url中有中文的时候,http会进行特殊编码,服务器需要解码之后才能看到中文
console.log(decodeURI(req.url)) //解析中文
// (2)处理 :增删改查
// (3)响应 :res
})
// 3.开启服务器(启动软件)
// 第一个参数 port 端口号
// 一台电脑只有一个id,但是有很多软件都能访问网络
// 第二个参数 hostname主机名(IP地址) 如果不谢,nide.js会自动识别本机ip
// 本机ip http://127.0.0.1 查找自己ip 在cmd打开ipconfig
// 第三个参数:完成回调
app.listen(3000,()=>{
console.log('服务器启动成功')
})
4.2 http模块响应服务器
导入http模块
const http=require('http')
创建服务器
const app=http.createServer((req,res)=>{
//请求
console.log(req.url)
//处理
//响应
//如果是中文,浏览器会显示乱码,需要设置请求头服务器告诉浏览器我给你的数据是什么格式
ressetHeader('Content-type','txt/plain;charset=utf8]')
res.end('今晚请你吃虾子')
})
开启服务器
app.listen(3000,()=>{
console.log('开启服务器成功')
})
//1.导入http模块
const http = require('http')
//2.创建服务器
const app = http.createServer((req,res)=>{
//(1)req : 请求
console.log( decodeURI(req.url) )//解析url中的中文
//(2)处理 :
//(3)res : 响应
//如果是中文,浏览器会显示乱码。 需要设置响应头 : 服务器告诉浏览器我给你的数据是什么格式
res.setHeader('Content-type','text/plain;charset=utf8')
res.end("今晚请你吃虾子")
})
//3.开启服务器
app.listen(3000,()=>{
console.log('服务器开启成功')
})
4.3根据不同路径相应不同数据
//1 导入http模块
const http=require('http')
//2 创建服务器
const app=html.createServer((req,res)=>{
//请求
console.log(req.url)
//处理
if(req.url == '/'){
res.end('index.html')
}else if(req.url=='login.html'){
res.end('我是登录页')
}else{
res.end('404 not found')
}
//响应
res.end('今晚请你吃虾子')
})
3 开启服务器
app.listen(3000,()=>{
console.log('服务器开启成功')
})
4.4node.js响应html文件
//1.导入模块
const http = require('http')
// 导入fs模板
const fs=require('fs')
// 1导入path模板
const path=require('path')
//2.创建服务器
const app = http.createServer((req,res)=>{
// (1) req请求
console.log(decodeURI(req.url))
// (2)处理 :根据不同路径响应不同的数据
if(req.url=='/'){
fs.readFile(path.join(__dirname,'index.html'),(err,data)=>{
if(err){
throw err
}else{
res.end(data)
}
})
}else if (req.url == '/login') {
// (3)res :响应
// 如果是中文,浏览器会显示乱码.需要设置响应头 :服务器告诉浏览器我给你的数据是什么格式
fs.readFile(path.join(__dirname, 'login.html'), (err, data) => {
if (err) {
throw err
} else {
//(3)响应
res.end(data)
}
})
}else{
// 如果上面的额路径都不对,一般就代表错误的路径
res.end('404 not found')
}
})
//3.开启服务器
app.listen(3000,()=>{
console.log('服务器开启成功')
})