本文共 4759 字,大约阅读时间需要 15 分钟。
Node运行环境内置的模块,在node中几乎所有的API的回调函数的第一个参数都是err,错误参数。
第一步都是引用文件模块
let fs = require('fs') //fs就是文件模块
读取文件使用相对路径是以命令行为起点的,要使用绝对路径
fs.readFile('文件的路径和名称'[,文件的编码一般都是utf8],functiont(err,res){ //这是回调函数,在读取文件之后,才能调用 //第一个参数是读取文件错误时的返回 //第二个参数是读取文件的内容 //所有一般先判断错误不存在,在执行文件内容的操作,以防一进来就使用文件内容,发生错误。 if(err ==null){ console.log(res)}});
fs.writeFile('文件的路径和名称','数据',function(){ })
可以用来自动写错误日志,要是文件已有内容会删除掉文件已有内容,只保留这次写的数据,要是没有这个文件,会自动创建一个文件。
主要用来拼接路径,
在不同的操作系统中,路径的分格符不一致 node/test.js window中是\,/都可以 linux只有/ 而node有时候运行在linux系统,需要防错。 path会先判断你的操作系统是什么,会自动使用对应的分隔符。 第一步都是引入路径模块let path= require('path') //path就是路径模块
path.join('路径','路径',...)
只要写路径就行,不需要写分隔符,路径要按顺序写,一层一层往下。
//比如一个路径是node/test.jslet a = path.join('node','test.js')//node/test.js
比如俩个js文件在同一级目录下,
node文件夹下 test文件readFile(’./demo.js’)文件 然后命令行工具在这两个文件的同级打开,运行test文件 此时是test文件是能成功读取到demo文件的 但要是命令行工具在上一级文件打开, 此时再运行test文件,是不能读取到demo文件的, 由此可以看成,读取文件的操作不是以那个读取文件的js文件为起点的,而是以node运行环境为起点的。 所以一般读取文件,写入文件都是读取的绝对路径。require引入模块方法是以当前文件为起点的,比较特殊。
__dirname获取的是当前文件的绝对路径,然后使用readFile(path.jion(__dirnam,./demo.js),utf-8,function(){}),这样就能以这个读取文件的js文件为起点了。
这样无论命令行在哪里运行都是读取的绝对路径。这样不会出错。//引入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>'原封不动的显示在网页上,
app.on('request',(req.res)=>{ //req.method获取请求的方式get还是post,根据这个请求来进行逻辑操作。if(req.method == 'POST'){ //进行逻辑操作}})
req.headers//获取请求报文信息,headers是个对象,可以根据不同的属性来获取请求信息。//比如req.headers['accept']来获取请求头的accept的信息req.url //获取请求地址,域名后面的内容,可以获取get方法传递过来的参数。req.method //获取请求方法
res.end(返回的信息);//返回给客户端的数据res.writeHead('状态码,默认200',{ 'content-type':'text/plain;charset =utf8'//表示返回的内容类型,charset不写中文传过去会乱码。});//返回的状态码和内容的类型//plain表示纯文本,默认值,浏览器会把标签直接写在网页上,//html:表示是html文件,浏览器会解析标签。res.setHeader("Access-Control-Allow-Origin", "*");//设置请求头
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')})
req.url
用来处理url地址
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 }}**/})
就是用
url.parse(req.url,true).pathname
来判断请求的是什么地址
带参数后此时req.url不能用来判断请求的是什么地址了 一般通过这个来实现根据请求的地址返回不同的html文件专门用来处理key=value&key=value形式的字符串
let querystring =require('querystring')querystring.parse(params)
对现有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()
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模块。根据文件名来写对应的响应头。 高级浏览器会自动识别,而低级的不行,为了兼容性必须这么写。//引入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/