欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-05-20 09:38:01
...

刚刚接触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/
端口按照自己设置的填写

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