其他实现方式

今天开发的post.js插件,只是一种实现方式,下面介绍其他两种实现方式。

方式一

可以先把整个上传的body信息,保存到一个临时文件中,可以通过流的pipe方法做到。下面是演示代码:

// 创建一个写入流
var wstream = fs.createWriteStream("tmp");
// 通过管道方式写入
req.pipe(wstream);

这样就可以把上传来的数据保存到临时文件tmp中,当然具体实现还有很多注意事项,这只是个演示代码。然后,可以通过fs.read方式,循环读取tmp文件,并对其进行分析。部分代码如下:

fs.open("tmp",function(err,"r",fd){
   fs.read(fd ... , function(err, bytesRead, buffe){
          // 分析二进制数据
   }); 
})
这里的fs.open可以打开一个文件,并对其进行读取,过程中,并不会都加载到内存中,所以节省内存使用量。fs.read方法是实际读取文件的方法,这种方式对服务器端的压力相对很小,所以推荐这种方式。
方式二

上传的数据要是比较大,就会多次调用req.on("data",function(chunk){}),那就可以每次对chunk数据进行分析,而不必都加载后再处理,处理完这个chunk后,再进行下一个chunk,以此类推。不过需要用到 req.pause() 方法暂停读取客户端上传来的数据,然后处理完这个chunk后,再调用req.resume()继续接收客户端的数据流。这个方式比第一个方式还要更好些。


还有很多实现方式,需要你去挖掘。代码的优化也是无止境的,这种动态美让编程充满了乐趣和期待。今天的开发就到这里,留一个作业,独立开发一个上传插件,采用方式1和2都可以。 争取在一周内完成开发,完成后加载到stuwebfk框架内。比如书上的是post.js插件,你可以自己取个名字,比如mypost.js,然后在index.js中用 exports.mypost = require("./lib/mypost") 加载上,可以通过下面的代码使用:

app.use(fk.mypost);

要对自己有信心,实现过程中肯定会遇到问题,多思考一定会有答案,这是个成长的烦恼,才会有成功的喜悦!明天见。