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('服务器启动成功')

猜你喜欢

转载自blog.csdn.net/m0_48459838/article/details/113826917