nodejs學習筆記

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服務器

相關文章
相關標籤/搜索