Node.js的系统模块
Node运行环境内置的模块,在node中几乎所有的API的回调函数的第一个参数都是err,错误参数。
一、fs文件模块
第一步都是引用文件模块
let fs = require('fs') //fs就是文件模块
1.读取文件
读取文件使用相对路径是以命令行为起点的,要使用绝对路径
fs.readFile('文件的路径和名称'[,文件的编码一般都是utf8],functiont(err,res){
//这是回调函数,在读取文件之后,才能调用
//第一个参数是读取文件错误时的返回
//第二个参数是读取文件的内容
//所有一般先判断错误不存在,在执行文件内容的操作,以防一进来就使用文件内容,发生错误。
if(err ==null){
console.log(res)
}
});
2.写入文件操作
fs.writeFile('文件的路径和名称','数据',function(){
})
可以用来自动写错误日志,要是文件已有内容会删除掉文件已有内容,只保留这次写的数据,要是没有这个文件,会自动创建一个文件。
二.path路径模块
主要用来拼接路径,
在不同的操作系统中,路径的分格符不一致
node/test.js
window中是\,/都可以
linux只有/
而node有时候运行在linux系统,需要防错。
path会先判断你的操作系统是什么,会自动使用对应的分隔符。
第一步都是引入路径模块
let path= require('path') //path就是路径模块
1.拼接路径
path.join('路径','路径',...)
只要写路径就行,不需要写分隔符,路径要按顺序写,一层一层往下。
//比如一个路径是node/test.js
let a = path.join('node','test.js')//node/test.js
2.相对路径和绝对路径
比如俩个js文件在同一级目录下,
node文件夹下
test文件readFile(’./demo.js’)文件
然后命令行工具在这两个文件的同级打开,运行test文件
此时是test文件是能成功读取到demo文件的
但要是命令行工具在上一级文件打开,
此时再运行test文件,是不能读取到demo文件的,
由此可以看成,读取文件的操作不是以那个读取文件的js文件为起点的,而是以node运行环境为起点的。
所以一般读取文件,写入文件都是读取的绝对路径。
require引入模块方法是以当前文件为起点的,比较特殊。
3.获取当前文件的绝对路径
__dirname获取的是当前文件的绝对路径,然后使用readFile(path.jion(__dirnam,./demo.js),utf-8,function(){}),这样就能以这个读取文件的js文件为起点了。
这样无论命令行在哪里运行都是读取的绝对路径。这样不会出错。
三、http模块
1.创建服务器
//引入http模块
const http = require('http');
//创建一台服务器对象
const app = http.createServer();
//编写服务器接收request事件,on是绑定事件,req是请求头,res是相应信息。
app.on('request',(req.res)=>{
res.end('<h1>hello world<h1>)
})
//表示服务器的3000端口是网站服务。
app.listen(3000)
高级浏览器会自动识别h1标签,而低级的会把’<h1>hello world<h1>'原封不动的显示在网页上,
2.获取请求方式
app.on('request',(req.res)=>{
//req.method获取请求的方式get还是post,根据这个请求来进行逻辑操作。
if(req.method == 'POST'){
//进行逻辑操作
}
})
3.req对象属性
req.headers//获取请求报文信息,headers是个对象,可以根据不同的属性来获取请求信息。
//比如req.headers['accept']来获取请求头的accept的信息
req.url //获取请求地址,域名后面的内容,可以获取get方法传递过来的参数。
req.method //获取请求方法
4.res对象属性
res.end(返回的信息);//返回给客户端的数据
res.writeHead('状态码,默认200',{
'content-type':'text/plain;charset =utf8'//表示返回的内容类型,charset不写中文传过去会乱码。
});//返回的状态码和内容的类型
//plain表示纯文本,默认值,浏览器会把标签直接写在网页上,
//html:表示是html文件,浏览器会解析标签。
res.setHeader("Access-Control-Allow-Origin", "*");
//设置请求头
5.接收post请求的参数
post请求发送时会触发data事件,结束后会触发end事件。
app.on('request',(req.res)=>{
let params = ""
req.on('data',(data)=>{
params+=data
//data是传递过来的数据,数据不是一下传过来的,需要拼接起来
})
req.on('end'),()=>{
//操作params,打印出来是key=value&key=value形式的,也需要转换成对象形式
})
req.end('ok')
})
6.获取get参数
req.url
四、url模块
用来处理url地址
1.处理req.url获取的get方式提交的参数,把字符串转换成一个对象
const url = requrie('url')
const http = require('http');
const app = http.createServer();
app.on('request',(req.res)=>{
//req.url是?name=zs&age=18
//parse会把req.url获取到的参数转换成一个对象形式,方便获取提交过来的参数,之后通过对象点形式来获取参数。
url.parse(req.url,true)
//转换后,要是没写true
/**{
pathname:'/'
search:'?name=zs&age=18'
query:'name=zs&age=18' 这个比上面少个问好
}
还有其他的属性省略,可以方便我们取值。
true会把查询属性转换成对象形式
{
search:'?name=zs&age=18',
query:{
name:zs,
age:18
}
}
**/
})
2.获取请求的地址
就是用
url.parse(req.url,true).pathname
来判断请求的是什么地址
带参数后此时req.url不能用来判断请求的是什么地址了
一般通过这个来实现根据请求的地址返回不同的html文件
五、querystring模块
专门用来处理key=value&key=value形式的字符串
let querystring =require('querystring')
querystring.parse(params)
六、utily模块
对现有api包装,返回一个promise对象,从而支持异步函数方法。
const fs = require('fs')
const promisify = require('util').promisify
//promisify 返回一下新的方法,这个方法会返回一个promise对象。
const readFile = promisify (fs.readFile)
async function run(){
let r1 = await readFile(./index.html,'utf8')
console.log(r1)
}
run()
七、第三方插件模块(mime)
npm install mime
根据请求的地址来返回对应的文本格式
mime.getType(地址)//返回值是text/html,text/css可直接放到content-type里面
然后放到响应头部里,
因为在浏览器获取到html文件时,html包含的link和src也都是通过fs来获取的,所以要返回的
'content-type':'text/html;charset =utf8'
里面,不止要写text/html,还要写text/css,text/javascript
这样才能都返回。而不知道到底什么时候写那些,可以根据请求的文件名来判断,所以引入了mime模块。根据文件名来写对应的响应头。
高级浏览器会自动识别,而低级的不行,为了兼容性必须这么写。
八、案例
1.根据地址返回不同请求的内容
//引入http模块
const http = require('http');
const url = require('url')
const path = require('path')
const fs = require('fs')
//创建一台服务器
const app = http.createServer();
//编写服务器接收事件
app.on('request',(req,res)=>{
//获取请求的路径,利用url模块
let pathname = url.parse(req.url).pathname
//拼接好绝对路径,利用path模块
let readfile = path.join(__dirname,pathname);
//根据绝对路径读取对应的文件,要是返回的是html文件,已经包含了 <meta charset="UTF-8">,会自动编码,利用fs模块
fs.readFile(readfile,'utf8',(err,res2)=>{
if(err !=null){
res.writeHead('404',{
'content-type':'text/html;charset =utf8'
});
res.end('文件读取失败')
return
}else{
res.writeHead('200',{
'content-type':'text/html;charset =utf8'
});
//返回文件
res.end(res2)
}
})
console.log(readfile)
// res.writeHead('200',{
// 'content-type':'text/plain;charset =utf8'
// });
//表示返回的内容类型,返回的不是html文件,需要添加charset,不写中文传过去会乱码。
})
//表示服务器的3000端口是网站服务。
app.listen(3000)
console.log('服务器启动成功')