var http=require('http');
var url=require('url');
http.createServer(function(req,res){res.writeHead(200,{"Content-Type":"text/html;charset=utf-8"});
var str='<ul>';
for(i=1;i<=10;i++){str+='<li>'+i+'</li>';}
str+='</ul>';
res.write(str);
if(req.url.indexOf('favicon.ico') == -1){var result=url.parse(req.url,true);
console.log('aid='+result.query.aid)
}
res.end();}).listen(9999);
/*
调试流程:写好页面之后 cd 到该文件目录,node server.js 就能运行,但是每次修改都需要再次运行很麻烦,可以全局安装一个插
件,自动刷新
npm install -g supervisor
cd 到文件目录 supervisor server.js
ctrl+c 停止进程
http 模块
http 模块 node 本身自带,利用 createServer 方法可以创建 http 服务器,带两个参数,req 是请求参数,res 是返回参数,res.write 写入内容,res.end() 结束响应
每次浏览器访问会有两个请求一次是访问页面一次是获取 favicon.ico 图标,因此需要通过 req 中的 url 进行判断,如果
是后者则不打印信息,否则控制台会打印两次
url 模块
url 模块也是 node 自带,有三个方法:
url.parse(url,true) 可以把请求地址转化为对象,后面的 true 可以把 query 参数的内容转化为对象
url.format(urlObject) 与 parse() 正好相反,会把含有请求地址的对象转化为网址
url.resolve('http://www.baidu.com','news') 替换路径, 输出 http://www.baidu.com/news
如果地址本身自带二级目录会被覆盖 http://www.baidu.com/nav -> http://www.baidu.com/news
*/
//tools.js
var tools={add:function(x,y){return x+y;},
sayHello:function(){return '你好,nodejs';}
};
// exports.tools=tools;
module.exports=tools;
//common1.js
var http=require('http');
var tools=require('./tools');
// 如果 foo.js 不在根目录下会自动在 node_modules 文件夹下面找
var foo=require('foo');
// 如果 bar.js 在 node_modules 下的 bar 文件夹下就需要 bar/bar 这样写,如果有 package.json 文件就可以省略
var bar=require('bar');
http.createServer(function(req,res){res.writeHead(200,{'Content-Type':'text/html;charset=utf-8'});
res.write('你好,nodejs');
if(req.url.indexOf('favico') == -1){var sum=tools.add(5,16);
console.log(sum)
console.log(bar.str)
}
res.end();}).listen(9998);
/*
在 commonjs 规范下引入模块,自定义模块
通过 require 引入,根目录下使用./ 找到文件,不在根目录下的文件会自动从 node_modules 文件夹内寻找,node_modules 下面还有文件夹怎么办?cd 到那个文件夹(本例是 bar)输入 npm init --yes 会自动生成一个 package.json 文件,里面的 main 是入口文件,有了这个 json 文件就不需要根据
目录找寻存放在 node_modules 下多级文件夹下的文件,require 的时候直接把文件夹的名字写入就可以
暴露模块
exports foo=foo; 使用的时候会多一层对象, 例如 tools.tools.add()
module.exports=foo; 可以直接找到模块内的变量或者函数例如 tools.add()
*/
var http=require('http');
var fs=require('fs');
http.createServer(function(req,res){res.writeHead(200,{"Content-Type":"text/html;charset=utf-8"});
if(req.url.indexOf('favicon.ico') == -1){fs.stat('html',function(err,stats){if(err){console.log(err)
}else{console.log('文件:'+stats.isFile())
console.log('目录:'+stats.isDirectory())
}
})
fs.mkdir('css', function(err){if(err){console.log(err);
return false;
}
console.log('创建成功');
});
fs.writeFile('t.txt','你好,nodejs',function(err){if(err){console.log(err)
return;
}
console.log('写入成功')
});
fs.appendFile('t1.txt','不存在就创建 \n', 'utf8', function(err){if(err){console.log(err)
return;
}
console.log('追加成功')
});
fs.readFile('html/index.html',function(err,data){if(err){console.log(err)
return;
}
console.log('读取成功')
console.log(data.toString())
});
fs.readdir('html',function(err,data){if(err){console.log(err)
return;
}
console.log('读取成功')
console.log(data)
});
fs.rename('html/index2.html', 'html/newsName.html', function(err){// 改名 剪切
if(err){console.log(err)
return;
}
console.log('改名成功')
});
fs.rename('html/newName.html', 'html2/newName.html', function(err){// 改名 剪切
if(err){console.log(err)
return;
}
console.log('剪切成功')
});
fs.rmdir('delmkdir', function(err){if(err){console.log(err)
return;
}
console.log('删除目录成功')
});
fs.unlink('remove.txt', function(err){if(err){console.log(err)
return;
}
console.log('删除文件成功')
});
// 示例:判断 upload 文件夹是否存在,不存在就创建
fs.stat('upload',function(err,stu){if(err){fs.mkdir('upload',function(err2){if(err2){console.log(err2);
return false;
}
console.log('创建成功!');
});
}else{console.log('目录已经存在!');
}
})
// 示例:获取文件目录,并且打印出文件类型(文件 / 目录)fs.readdir('html',function(err,data){if(err){console.log(err);
return;
}
// 方式 1 循环 + 自治性函数
for(i=0;i<data.length;i++){(function getFileType(nums){fs.stat(data[nums],function(err,stau){// 异步操作
if(stau.isDirectory()){console.log(data[nums]+'是目录');
}else{console.log(data[nums]+'是文件');
}
})
})(i);
}
// 方式 2 递归自执行函数
(function getFileType(nums){if(nums >= data.length){return false;}
fs.stat('html/'+data[nums],function(err,stau){if(stau.isDirectory()){console.log(data[nums]+'是目录');
}else{console.log(data[nums]+'是文件');
}
getFileType(nums+1);
})
})(0);
});
//fs.stat 的操作类似下面的代码,会输出 3 个 3
for(i=0;i<3;i++){setTimeout(function(){console.log(i)
},500)
}
}
res.end();}).listen(9999);
/*
fs.stat(path, options, function(err,stau){});——检测是文件还是目录,异步操作
fs.mkdir(path, mode, function(err){});——创建目录
fs.writeFile(path, data, options, function(err){});——写入文件(会覆盖)fs.appendFile(path, data, options, function(err){});——追加文件
fs.readFile(path, options, function(err,data){});——读取文件,通过 toString() 转换为字符串
fs.rmdir(path, function(err,data){});——读取目录
fs.rename(oldPath, newPath, function(err){});——重命名文件,剪切文件
fs.unlink(path, function(err){});——删除文件
在最后一个示例中因为 fs.stat 是异步操作,因此要使用自执行函数,把异步操作转换为同步操作,分为两种形式循环 + 自
执行函数和递归自执行函数,需要注意的是在获取到目录后判断文件类型的时候要加上目录地址, 否则会报错
*/