NodeJS文件读取:感恩常在--抓把糖果,愉悦客人( 二 )


当然,这里举这个改进例子仅仅为了让大伙感受一下处理‘流数据’的精巧之处,回到我们的的场景,我们后面会采用其他的方式 。
改进2:
回到开头小明的例子,张大爷走过来逗小明说:“我不要巧克力,我想要一个果冻 。”小明到屋里找了一下,发现没有果冻,小明该怎么办?
同样,异常的处理也是的重要特性,前文我们讲过,是单进程、单线程的,所以,对于异常的处理需要十分谨慎 。读取文件的时候,也有可能出现异常,比如:被读取的文件不存在 。
现在,我们就增加异常处理机制,改进后的代码如下:
1 var http = require( 'http' ); 2 var fs = require('fs'); 34 var file_path = "D:\\ilinkit_logo.png" ; 5 var file_stream ; 67 var server =http.createServer( function ( request ,response ){ 8fs.stat( file_path , function ( err , stat ){ 9if (err) {10if ('ENOENT' == err.code) {11console.log( 'File does not exist...' );12response.end( 'File does not exist...' );13} else {14console.log( 'Read file exception...' );15response.end( 'Read file exception...' );16}17} else {18file_stream = fs.createReadStream( file_path );19file_stream.on( 'data' , function( chunk ){20response.write( chunk );21} ); 22file_stream.on( 'end' , function(){23response.end( "" );24console.log( "文件读取完毕" );25} );26file_stream.on('error', function(err){27response.end( "文件读取失败!" );28});29}//end else,读取文件没有发生错误30}); 31 } );32 server.listen( 8000 );33 console.log( 'HTTP服务器启动中,端口:8000.....' );
我们重点分析改进的部分:
第8行代码,通过fs.stat可以读取指定文件相关的信息,如果发生异常,则调用异常处理程序,第9行开始的代码;如果没有异常,则读取文件,用文件的内容响应客户端,从第17行开始 。从这里可以看出中异常处理的一个特点:通常会传入一个包含error对象的回调函数(这里声明为err),异常发生时,通过error对象可以获得异常相关的信息 。
第10行到第13行,如果错误的类型是文件不存在,则告知客户端,文件不存在,并在服务端输出日志 。
第13行到第16行,如果是其他的异常,则输出另外的提示内容 。
第17行到第29行,代码逻辑,和前面的一样,就不再赘述 。
验证方式:
1. 启动服务器:打开命令行,进入js脚本所在的位置,执行:node .js
2. 打开浏览器,输入::8000,显示如下:

NodeJS文件读取:感恩常在--抓把糖果,愉悦客人

文章插图
3. 现在,我们暂时将文件D:\.png删除,或者重命名 。
打开浏览器,输入::8000,显示如下:
NodeJS文件读取:感恩常在--抓把糖果,愉悦客人

文章插图
客户端得到的消息是:File does not exist....
【要点回顾】
今天的解说就到这里,我们一起来回顾一下要点:
1. 用fs模块来实现文件的读取 。
2. 展示了fs的pipe机制 。
3. 结合fs.stat展示了异常处理的基本特征 。
正如本系列文章所说,这一系列文章的目的是通过一个具体业务场景文件共享传送(),来描述的特征,目的是学习 。所以,采用一步一步、循序渐进地方式,以方便读者的理解,所以,整个系列文章也有如下特点:
1. 很多知识点没有深入展开讲
比如:我们讲了文件如何读取,但是没有讲文件如何写入 。因为我们以一个具体的场景为主线,这个场景不涉及的,用不到的,可能就不会去展开讲 。这一系列文章的定位是入门,展现的精彩特性 。如果想更深入地理解技术细节,在真正的项目中,建议读者参阅官方的社区网站,或更权威的技术指导书 。