My first JSON server我的第一个JSON服务器

刚刚接触node.js, 根据书中(node.js实战)的代码写了一个简单的本地服务器. 

var http= require("http"),
fs = require("fs");

function load_album_list(callback){
fs.readdir( //该函数返回指定文件夹下的所有项(除了"."和"..")
"albums", //指定文件夹
function(err,files) { 
if (err){
callback(err);
return;
}

var only_dirs= []; //这里定义个数组来缓存响应, 存放目录文件(文件夹,而非文件)
(function iterator(index){ //异步循环遍历文件, 来筛选目录文件
if (index== files.length){
callback(null,only_dirs);
return;
}
fs.stat( //fs.stat,这个函数传入一个对象, 可以检测是否为文件夹
"albums/"+ files[index],
function(err,stats) {
if (err){
callback(err);
return;
}
if (stats.isDirectory()){
only_dirs.push(files[index]);
}
iterator(index+ 1); //递归实现遍历
}
);
})(0); //这里用了立即执行函数, 可以防止弄乱作用域
}
);
}

function handle_incoming_request(req,res) { //响应头, 注意这里的两个参数顺序不能错
console.log("INCOMING REQUEST:" + req.method+ "" + req.url);
load_album_list(function(err,albums) {
if (err){
res.writeHead(503,{ "Content-Type":"application/json"}); 
res.end(JSON.stringify(err)+ "\n");
return;
}
var out= {
error:null, //null, 代表没有发生错误
data: { albums:albums }
};
res.writeHead(200,{ "Content-Type":"application/json"});
res.end(JSON.stringify({out }) + "\n");
});

}

var s = http.createServer(handle_incoming_request); //创建服务器
s.listen(8080); //8080端口监听

这里面需要注意的是文件夹遍历的函数使用的是异步循环, 因为Node.js是单线程运行的, 若是使用for循环并调用callback参数, 如下

for (vari = 0; i< files.length;i++) {
fs.stat(
"albums/"+ files[i],
function(err,stats) {
if (stats.isDirectory()){
only_dirs.push(files[i]);
}
}
);
}

非阻塞机制使得文件数组的每一项调用fs.stat以后都没有机会执行回调函数, 结果是only_dirs的值一直是null, 并将值传出. 而fs.stat的回调函数最终执行时, 已经没有用了. 

(大佬请忽略此处)若想本地测试此代码,仅需复制第一段代码, 并在代码所在文件夹建立albums文件夹(可以更改代码来换成你喜欢的), 里面任意添加文件夹和文件用来测试,

 在代码文件所在文件夹下打开命令窗口(shift + 鼠标右键), 输入 :   node  文件名             

这样就打开服务器了, 接下来的测试方式我使用curl, 

输入:

curl -X GET http://localhost:8080/
端口按照自己设置的填写

这样就可以看到返回的结果


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值