app=function(req,res) { res.writeHead(200,{'Content-Type':'text/plain'}) var buffer=new Buffer(100) var fs=require('fs') fs.open('.'+req.url,'r',function(err,fd){ fs.fstat(fd,function(err, stats){ var i=0 var s=stats.size console.log('.'+req.url+' '+s) for(i=0;i<s;console.log(i)){ i=i+buffer.length fs.read(fd,buffer,0,buffer.length,i,function(e,l,b){ res.write(b.toString('utf8',0,l)) console.log(b.toString('utf8',0,l)) }) } res.end() fs.close(fd) }) }) } http = require('http') server = http.createServer(app) server.listen(8000,"127.0.0.1") console.log('GET http://127.0.0.1:8000/appwsgi/www/index.htm')
为什么这只显示979个字节文件中的最后100个字节多次?
chrome浏览器为什么不显示任何输出?
gert@node:~/http$ node server.js GET http://127.0.0.1:8000/appwsgi/www/index.htm ./appwsgi/www/index.htm 979 100 200 300 400 500 600 700 800 900 1000 "vi/vi.htm">vi</a> Edit online files on the server. </div> </body> </html> oad.<br/> <a href= "vi/vi.htm">vi</a> Edit online files on the server. </div> </body> </html> oad.<br/> <a href= "vi/vi.htm">vi</a> Edit online files on the server. </div> </body> </html> oad.<br/> <a href= "vi/vi.htm">vi</a> Edit online files on the server. </div> </body> </html> oad.<br/> <a href= "vi/vi.htm">vi</a> Edit online files on the server. </div> </body> </html> oad.<br/> <a href= "vi/vi.htm">vi</a> Edit online files on the server. </div> </body> </html> oad.<br/> <a href= "vi/vi.htm">vi</a> Edit online files on the server. </div> </body> </html> oad.<br/> <a href= "vi/vi.htm">vi</a> Edit online files on the server. </div> </body> </html> oad.<br/> <a href= "vi/vi.htm">vi</a> Edit online files on the server. </div> </body> </html>
所有读取均使用相同的缓冲区异步发出(即,fs.read立即返回,并且循环继续)。到第一次调用异步回调时,显然所有十次读取都已完成(因此缓冲区包含最后一次读取的结果)。由于您致电fs.read 10次,因此您将被致电10次。这样您就可以看到。
浏览器未显示任何内容,因为您在第一个回调返回之前已经结束了响应。