前面我们通过文章【Node实战002:一个简单的hello world实例 】简单地了解了下NodeJS搭建Web服务器,这时我们可以在浏览器通过ip加端口(不带端口默认访问80)来访问我们的Node服务。我们知道一个Web服务一遍都有几十上百个页面,当我们访问不同的地址时会返回不同的页面内容。但是这里我们不管输入任何地址返回的都是“hello world”,这显然无法满足我们的业务需求。这是为什么呢?因为我们在服务中没有对请求做任何处理,不管你请求任何内容都统一返回“hello world”。
request
这里我们需要根据业务需求对请求进行处理,这里我们就需要来了解一个参数request。request包含了浏览器的所有请求信息(打印了下有600多行参数信息),其中有个url属性携带的就是前端发来的请求地址。我们可以通过该属性来判断当前请求的路由地址,这样我们就可以根据不同的请求地址来响应不同的内容返回给前端。这时候当我们访问http://127.0.0.1:8080/a.html就会输出内容a.html,如果访问的不在我们定义的路由中就返回404告诉浏览器页面没有找到。
Html静态目录
但是这里有个问题那就是每添加一条请求我们就需要后台去case一遍做相应的处理,这样就会出现相当多的case(要是个遇到个成百上千个页面的项目岂不是要被逼疯)。而且关键的是每次修改都需要重启服务才会生效,这样重启服务不仅影响服务使用也影响用户体验。所以这里我们需要改善下像nginx那样将文件全部放在html目录然后根据路由读取对应的文件,这样即可以避免一路case判断也不用重启服务器。为什么这样就不需要重启服务器呢?因为此时文件的内容并没有写在服务器中,而是在请求的时候去读取文件内容。所以文件的增、删、改并不影响服务器运行,这样我们就可以像nginx那样随时发布更新代码了。
FS文件操作
Node提供一组标准的文件操作API,直接通过require('fs') 引用该模块即可使用一系列文件操作的API。读取文件内容的函数有异步的 fs.readFile() 和同步的 fs.readFileSync(),一般我们都使用异步操作。因为异步性能更高,速度更快而且没有阻塞,这样就不会阻碍后面的代码执行了。这里我们需要用到fs模块中的readFile方法,函数原型:fs.readFile(path,[options], [callback(err,data)])。其中参数filename为必填,表示要读取的文件名。参数options为可选,如表示文件的字符编码。参数callback是个回调函数,用来接收文件的内容。回调函数的第一个参数为读取错误触发的信息,第二个参数为成功读取到的数据。
总结:
服务器响应用户请求时不仅有文本信息还会有二进制文件(图片、视频、文件等),通过FS模块我们可以方便快捷地将用户所需的内容读取出来并作为响应数据返回给浏览器。以上内容是小编给大家分享的【Node实战003:FS文件操作实现请求动态响应】。希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。
为了方便学习,下面附上本文用到的源码:
var http = require('http')var fs =require('fs')var server=http.createServer()server.on('request',(req,res)=>{ var filename='/html'+req.url; fs.readFile(filename,(err,data)=>{ if(err){ res.write('404') } else{ res.end(data) } //res.end(data)相当于res.write(data); res.end(); })})server.listen(8080,()=>{ console.log('服务器启动成功了,通过 http://127.0.0.1:8080/ 来进行访问')})