目录
一、http模块
var app=http.createServer((req,res)=>{}) 创建一个服务器
app.listen(81) //端口的意义:ip是访问计算机的标志 端口就可以进入计算机的具体哪一个程序
res.setHeader( 'content-Type ' , 'text/plain; charset=utf8 ') //设置编码和数据包格式
res.write("xxx") //可以多次调用 代表给前端传输数据
res.end() //可以传输数据也可以不传输,它是当前这一次网络请求结束的标志,一旦执行了就断开连接
req.url 前端给后端发送 网络请求的网址"http://ip:port"后面的部分字符串
解析url来做出不同页面的网址 和不同参数传不同数据网址
//引入官方的http模块
var http=require("http")
//创建一个服务器
var app=http.createServer((req,res)=>{
//判断用户输入的网址
if(req.url=="/hq"){
//设置数据的头部信息为html文本文档,编码为utf8
res.setHeader( 'content-Type' , 'text/plain; charset=utf8 ')
//持续写入数据包中
res.write("<h1>欢迎来到1</h1>")
res.write("<h1>欢迎来到2</h1>")
//最后一次写入数据包,并断开连接
res.end("<h2>hai</h2>") //end和return很像,它执行后,后面就不再执行了
}
})
app.listen(8081) //监听端口
//用户浏览器地址栏输入:http://服务器电脑的ip:8081/hq 每当用户访问一次,后端的那个回调函数就会执行一次
二、路径 __dirname _filename
在node.js环境中,有两个全局变量
全局变量 __dirname是一个字符串,代表当前js文件所在目录的路径(绝对路径)
全局变量 __filename是一个字符串,代表当前js文件的路径(绝对路径)
总结: __dirname+‘\5-_dirname.js’ ==>__filename
console.log(__dirname,123,__filename)
//D:\存储\桌面\前端\07-全栈笔记\代码
//123
//D:\存储\桌面\前端\07-全栈笔记\ 代码\5-_dirname.js
三、fs模块
1、读取文件 fs.readFile
fs.readFile(path,(err,data)=>{})
path 填路径 可以绝对可以相对
err代表读取失败
data代表读取成功 它是一个buffer类型的数据(二进制数据流) ,可以通过toString()转化为字符串 , data.toString ==> 就是这个html/css等代码 (注意:图片就不要转字符串了,就发送buffer)
注意:res.end()方法接受 字符串或者buffer
//引入fs系统自带的模块 file system
var fs=require("fs")
// ./就是写这个文件它所在的目录
fs.readFile("./img/h5.png",(err,data)=>{
console.log(err,data) //null <Buffer 89 50 ... 8174 more bytes>
}) //如果错了,那err就是一个对象,data是undefined
fs.readFile("./text.txt",(err,data)=>{
console.log(err,data)
})
//这两个是异步执行的
./img/h5.png这里的路径不能写http://www.baidu.com,别人的网站,也就是别人的服务器。要想要进入别人的网站,就写一个html,将网站写在里面,在我的后端获取html
2、写入文件 (创建文件) fs.writeFile
fs.writeFile(path ,data,callback(er))
如果文件存在,该方法写入的内容会 覆盖旧的文件内容,不存在就创建一个新的
path - 文件路径 (eg: __dirname+‘./1.txt’ )
data - 要写入文件的数据,可以是 String(字符串)
callback - 回调函数,回调函数只包含错误信息参数(err),在写入失败时返回。
function(err){} 成功时:err=null (如果文件夹不存在就报错,文件不存在就创建)
fs.writeFile(__dirname + "./img/1.png", "hello", function (err) {
console.log(err)
})
3、删除文件 fs.unlink
fs.unlink(path,callback(err))
path - 文件路径。
callback(err) - 删除回调函数,err错误信息
删除文件,如果遇到权限问题,会删除失败
fs.unlink(__dirname + "./img/1.png",(err)=> {
console.log(err)
})
4、以追加方式写文件 fs.appendFile
fs.appendFile(__dirname + '/test.txt', '我会追加到文件内容的末尾', function (er) { console.log('追加内容完成'); })
如果没有这个文件,就会创建一个
fs.appendFile(__dirname + "./1.txt", "hello",(err)=> {
console.log(err)
})
5、创建目录
fs.mkdir(__dirname + '/test', function (err) { if(err) throw err console.log('创建目录成功') })
fs.mkdir(__dirname + '/test',(err)=>{}) //创建文件夹,就算写1.jpg,也是创建了一个文件夹,叫做1.jpg
6、移动 / 重命名文件或目录:
整个功能相当于 重命名一个文件/文件夹路径
fs.rename(oldPath, newPath, callback);
oldPath, 原目录/文件的完整路径及名;
newPath, 新目录/文件的完整路径及名;如果新路径与原路径相同,而只文件名不同,则是重命名
callback(err), 操作完成回调函数;err操作失败对象
移动文件有一个bug:新路径和旧路径必须是同一个根盘,也就是不能将C盘的东西移动到D盘
//移动
fs.mkdir(__dirname + '/test',(err)=>{}) //创建文件夹
var oldPath=__dirname + '/src/a/1.txt' //1.txt就移走了
var newPath=__dirname + '/src/b/1.txt'
fs.rename(oldPath, newPath, (err)=>{});
//重命名
fs.mkdir(__dirname + '/test',(err)=>{}) //创建文件夹
var oldPath=__dirname + '/src/a/1.txt' //1.txt重新命名为2.txt,位置不变,里面内容也不变
var newPath=__dirname + '/src/a/2.txt'
fs.rename(oldPath, newPath, (err)=>{});
7、拷贝文件
fs.copyFile(oldPath, newPath, callback);
oldPath, 原文件的完整路径;
newPath, 新文件的完整路径;
callback(err), 操作完成回调函数;err操作失败对象
拷贝文件以后两个文件都会存在磁盘中
var oldPath=__dirname + '/src/1.txt' //原来的资源也还在,就有两个相同的
var newPath=__dirname + '/src2/1.txt'
fs.copyFileSync(oldPath, newPath, (err)=>{
fs.unlink(oldPath,()=>{}) //将原来的文件删了
});
8、读取目录/文件夹 fs.readdir
fs.readdir(__dirname,(err,arr)=>{
console.log(err,arr)
})
fs的功能非常多,可以在 File system | Node.js v16.16.0 Documentation 进行学习查阅
四、http+fs
假设电脑的ip为:192.168.6.160,如果输入192.168.6.160:8081(或者192.168.6.160:8081/ 两者一样),最后页面上是error
如果后端的js的代码改变了,就要重新起服务器。如果只是后端引入的外部的一个html、css等文件修改了,就不需要重启服务器,只需更新网页即可
//写一个简单的http服务器
//引入官方的http模块:这个模块可以调用函数,来创建后端服务器
var http = require("http")
var fs = require("fs")
//创建一个服务器 (回调函数不会直接运行,会在用户每次访问当前计算机的IP下的8081端口时,就会调用,如果后面还加了/home /car等等,这个函数也会调用,会反应相应的代码。)
var app = http.createServer((req, res) => { //req前端发来的数据包 res后端给前端的数据包的相关设置
//前端的每一次网络请求,这个函数都会重新运行一次
console.log(111)
//判断用户输入的网址
if (req.url == "/home") { //http://192.168.6.160:8081/home就会返回下面
//设置数据的头部信息为html文本文档,编码为utf8。配置返回给用户的数据包 的数据格式 和编码的类型utf8(中文的时候写utf8)
//MIME类型:'img/png'等等
res.setHeader('content-Type', 'text/plain; charset=utf8 ')
//持续写入数据包中
res.write("<h1>欢迎来到1</h1>")
res.write("<h1>欢迎来到2</h1>")
//最后一次写入数据包,并断开连接
res.end("<h2>我的世界</h2>") //end函数只接收string或者buffer
}
else if (req.url == "/car") {
res.setHeader('content-Type', 'text/plain; charset=utf8 ')
res.end("<h2>我的世界</h2>")
}
else if (req.url = "/img/h5.png") { //输入:http://192.168.1.11:8081/img/h5.png时,显示图片
fs.readFile("./img/h5.png", (err, data) => {
//当"./img/h5.png"这个照片读取后(无论成功或者失败),就会调用后面的函数
//如果失败了,err是一个对象,data是undefined
//"./img/h5.png"这是相对路径,但是一般都是写绝对路径
//相对路径:写这个代码的所在文件的目录
if (!err) { //代表err没错
res.end(data) //data就是图片的编码——buffer(二进制)
} else {
res.end("not 404")
}
})
}
else if(req.url = "/favicon.ico") { //这是网页的上面的小图标,每次会自发的网络请求favicon.ico
fs.readFile("./favicon.ico",(err,data)=>{
res.end(data)
})
}
else {
res.setHeader('content-Type', 'text/plain; charset=utf8 ')
res.end("<h1>你好 你网址乱输的 404 </h1>")
}
})
app.listen(8081) //监听端口 别人输入 我电脑的ip地址:8081,就可以访问到这代码
//用户浏览器地址栏输入:http://服务器电脑的ip:8081/home 每当用户访问一次
http://192.168.6.60:8081/ 和http://192.168.6.60:8081 一样,后面不写/ 浏览器会自动补全,就相当于pathname=/,所以data=undefined
五、静态网站
var http=require("http")
var fs=require("fs")
var app=http.createServer((req,res)=>{
//这一段代码可以代替下面所有的if else
//fs.readFile(__dirname+req.url,(err,data)=>{
//res.setHeader('content-Type','text/html')
//res.end(data)
//})
//前端的每一次网络请求 这个函数都会重新运行一次
if(req.url=="/home"){
fs.readFile("./index.html",(err,data)=>{ //"./index.html"上传的是一个html文件
res.setHeader("content-Type","text/html;charset=utf8") //text是一个大类型,还有redio、image等等。html是小类型,比如image有png、jpg等等
res.end(data)
})
}
else if(req.url=="/123"){
res.setHeader("content-Type","text/html;charset=utf8")
res.end("123")
}
else if(req.url=="/src/18.jpg"){
fs.readFile("./src/18.jpg",(err,data)=>{
res.setHeader("content-Type","image/png")
res.end(data)
})
}
else{
res.end("404")
}
})
app.listen(8081)
//现在能用的网址有三个:http://192.168.1.11:8081/home、http://192.168.1.11:8081/123、http://192.168.1.11:8081/src/18.jpg
//其它无用的网址有无数个:http://192.168.1.11:8081/这里随便输==>返回404
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<h1>66666home</h1>
<!-- 这张图片是用的别人的服务器,不用将图片下载下来。img标签来显示图片 -->
<!-- 运行到此行代码的时候,会向服务器(别人的)发送请求 -->
<img src="https://img2.baidu.com/it/u=1814268193,3619863984&fm=253&app=138&size=w931&n=0&f=JPEG&fmt=auto?sec=1659027600&t=da7fd98b047c3241fd1bd1a0047601d5">
<p>hello</p>
<!-- 运行到此行代码的时候,会向服务器(自己的)发送请求 。与上面的服务器是两个服务器(192.168.6.60我自己的ip)-->
<img src="http://192.168.6.60:8081/src/18.jpg"> <!-- 绝对网络路径 -->
<img src="/src/18.jpg"> <!-- 相对根路径 -->
<!-- /src/18.jpg ==> 当前网页的网址中 http://ip:port/src/18.jpg --> <a href="/123">xxxx</a> <!-- http://ip:port/123 -->
</body>
</html>