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

相关文章
相关标签/搜索