http模塊,url模塊
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()
*/
fs模塊--文件基本操做
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('目錄已經存在!');
}
})
//示例:獲取文件目錄,而且打印出文件類型(文件or目錄)
fs.readdir('html',function(err,data){
if(err){
console.log(err);
return;
}
//遞歸自執行函數
var str='<ul>';
var fileArr=[];//文件夾類型數組
var docArr=[];//文件類型數組
(function getFileType(nums){
if(nums >= data.length){
if(fileArr.length > 0){
for(i=0;i<fileArr.length;i++){
str+='<li style="color:red">[文件夾]'+fileArr[i]+'</li>';
}
}
if(docArr.length > 0){
for(i=0;i<docArr.length;i++){
str+='<li>[文件]'+docArr[i]+'</li>';
}
}
str+='</ul>';
res.writeHead(200,{"Content-Type":"text/html;charset=utf-8"});
res.write(str);
res.end();
return false;
}
fs.stat('html/'+data[nums],function(err,stau){
if(stau.isDirectory()){
fileArr.push(data[nums]);
}else{
docArr.push(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是異步操做,所以要使用自執行函數,把異步操做轉換爲同步操做,分爲兩種形式循環+自
執行函數和遞歸自執行函數,
須要注意的是在獲取到目錄後判斷文件類型的時候要加上目錄地址,不然會報錯
*/
fs模塊--文件流
var fs = require("fs");
var reradStream = fs.createReadStream('input.txt');
var writerStream = fs.createWriteStream('output.txt');
var data = '我是從數據庫獲取的數據,我要保存起來11\n';
// 讀取文件流
var str='';
var count=0;
reradStream.on('data',function(chunk){
str+=chunk;
count++;
})
reradStream.on('end',function(chunk){
console.log(str)
console.log(count)
console.log('讀取完成')
})
reradStream.on('error',function(error){
console.log(error)
})
// 寫入文件流
for(var i=0;i<10;i++){
writerStream.write(data,'utf8');
}
//標記寫入完成
writerStream.end();
writerStream.on('finish',function(){
console.log('寫入完成111');
});
//失敗
writerStream.on('error',function(){
console.log('寫入失敗');
});
// 管道
reradStream.pipe(writerStream);
/*
fs.createReadStream('fileName')建立文件流讀取對象
用on接受廣播:
data:分片讀取;
end:讀取結束
error:錯誤信息
fs.createWriteStream('fileName')建立文件流寫入對象
.end():標記文件末尾
用on接受廣播
finish:寫入結束
error:寫入錯誤
管道pipe()
reradStream.pipe(writerStream),讀取後可直接寫入
*/
建立一個WEB服務器