您的位置:首页 > Web前端 > Node.js

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

2017-07-25 10:21 453 查看
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("异步方法执行完毕");
},运行效果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: