node.js学习之读取文件初步

n5_readfile.js:

var http = require('http');

var optfile = require("./models/optfile.js");

http.createServer(function(request,response){
        response.writeHead(200,{'Content-Type':'text/html;charset=utf-8'});
        if(request.url!=="/favicon.ico"){
			//optfile.readfileSync('./views/login.html');//同步执行
			optfile.readfile('./views/login.html');//异步执行
			console.log("程序执行完毕");
            response.end('');
        }
}).listen(3000);
console.log('Server running at http://127.0.0.1:3000/'); 


./models/optfile.js:

//fs是node中操作文件的类
var fs = require('fs');
module.exports={
	readfile:function(path){//异步读取文件
		fs.readFile(path,function(err,data){
			if(err){
				console.log(err);
			}else{
				console.log(data.toString());
			}
		});
		console.log("异步方法执行完毕");
	},
	readfileSync:function(path){//同步读取
		var data = fs.readFileSync(path,'utf-8');
		console.log(data);
		console.log("同步方法执行完毕");
	}
}
需要读取的文件在./views/login.html

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8" />
		<title>欢迎登陆</title>
	</head>
	<body>
		
	</body>
</html>

下面分别是同步和异步的运行结果:

同步:

可以看出,同步是先执行readfileSync方法,等方法执行完毕后再执行主程序中的语句

console.log("程序执行完毕");

异步执行结果:


可以看出,程序并没有等下面语句

fs.readFile(path,function(err,data){
			if(err){
				console.log(err);
			}else{
				//console.log(data.toString());
				res.write(data.toString());
			}
		});
执行完,接着就执行了

console.log("异步方法执行完毕");
然后返回主程序,执行
console.log("程序执行完毕");

那么,如果我想把要读取的文件输出到客户端,也就是浏览器上,应该怎么做呢?

我们可以在异步读取文件的函数加一个参数res,像这样

readfile:function(path,res){//异步读取文件
		fs.readFile(path,function(err,data){
			if(err){
				console.log(err);
			}else{
				//console.log(data.toString());
				res.write(data.toString());
			}
		});
		console.log("异步方法执行完毕");
	},
在主程序中这样调用

optfile.readfile('./views/login.html',response);//异步执行

但是这样做,在运行时会有一个错误

其实产生错误的原因就是,程序在“res.write(data.toString());”还没有执行的时候,就执行了“response.end('');”,表示协议尾已经执行完了,此时再执行res.write()函数,肯定会报错。解决方法就是用闭包。

主程序这样写:

if(request.url!=="/favicon.ico"){
			function recall(data){
				response.write(data);
				response.end('');
			}
			optfile.readfile('./views/login.html',recall);//异步执行
			console.log("程序执行完毕");
            
        }
optfiel.js文件中的异步读取方法改写:

readfile:function(path,recall){//异步读取文件
		fs.readFile(path,function(err,data){
			if(err){
				console.log(err);
			}else{
				//res.write(data.toString());
				recall(data);
			}
		});
		console.log("异步方法执行完毕");
	},
运行效果:






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值