博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Node.js的系统模块
阅读量:784 次
发布时间:2019-03-25

本文共 4759 字,大约阅读时间需要 15 分钟。

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.jslet 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('

hello world

)})//表示服务器的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文件,已经包含了
,会自动编码,利用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('服务器启动成功')

转载地址:http://hneuk.baihongyu.com/

你可能感兴趣的文章