nodeschool学习

安利一个学习node.js的网址

Nodeschool 教你 Web 开发技能的开源课程,自学或者参加一个附近的教学活动。

里面的node初级教程一共13个task,学下来应该收获颇丰。

1,在node环境编译js

2,获取命令行输入的参数

let arr = []
function add(arr){
    for(var i = 2 ; i < process.argv.length ; i++){
        //从第三个参数开始才是我们输入的参数
        arr.push(parseInt(process.argv[i]))
    }
    
    //累加
    var tol = arr.reduce(function(per,cur){
        return per + cur
    })
    return tol
}

var total = add(arr)
console.log(total)

通过全局变量process.argv获取参数数组,reduce函数累加获取总数

3,第一个I/O

var fs = require('fs')

//同步
//var str = fs.readFileSync('text.txt')
fs.readFile('text.txt',function(err,data){
    if(err){
        console.log(err)
        return
    }else{
        console.log('一共'+data.toString().split('\n').length+'行')
    }
})

readFile不带sync,代表同步读取,读取本地资源并输出

4,第一个异步I/O

5,LS过滤器

继续了解node的fa和path模块,读取目录文件(readdir),输出特定后缀格式的文件(extname)

6,使其模块化

module代码

//接收两个参数,通过module.exports导出,遵循commonJs规范
//这里提一下。。。
//AMD是从commonJs中分离出来的,推崇依赖前置,按需加载,使用difine定义模块。CMD推崇依赖就近。
module.exports = function mymodule(dirName,ext,callback){
    var fs = require('fs')
    var path = require('path')
    var fileList = []
    fs.readdir(dirName,function(err,list){
        if(err){
            return callback(err)
        }
        for(var filename of list){
            //console.log(path.extname(filename))
            if(path.extname(filename) == ext){
                fileList.push(filename)
            }
        }   
                //传递的参数中可传回调函数,参数可以后面再写,空的参数以null替代
        return callback(null,fileList)
    })
}

导入代码

//模块所依赖的模块已经自行导入,再使用时不必导入
var mymodule = require('./test3.js')
mymodule('../Node2','.js',function(err,list){
    if(err){
        console.log(err)
        return
    }else{
        console.log(list)
    }
})

7,HTTP 客户端

http.get()请求第三方资源

var http = require('http')

var Url = process.argv[2]
http.get(Url,res=>{
    res.setEncoding('utf8');
    res.on('data',data=>{
        //直接爬下网站的html文档了
        console.log(data)
    })
    res.on('end',()=>{
        console.log('请求结束')
    })
}).on('error',err=>{
    console.log('请求失败')
})

8,HTTP收集器

get请求到的资源不是一次性收集到的,而是一段一段慢慢传过来的,将每一段在res.on('data')中监听起来,在res.on('end')中输出才算是收集成功

var http = require('http')

var Url = process.argv[2]
//console.log(Url)
http.get(Url,res=>{
    var data = ''
    res.setEncoding('utf8');
    res.on('data',res=>{
        //累加收集
        data += res
    })
    res.on('end',()=>{
        console.log(data.length)
        console.log(data)
    })
}).on('error',err=>{
    console.log('请求失败')
})

9,异步回调

var http = require('http')
var index = 2


getInfor()

function getInfor(){
    var Url = process.argv[index]
        if(!Url){
            return
        }   
 http.get(Url,res=>{
    var data = ''
    res.setEncoding('utf8');
    res.on('data',res=>{
        //直接爬下网站的html文档了
        data += res
    })
    res.on('end',()=>{
        console.log(data)
        index += 1
                //递归也能处理
        getInfor()
    })
    }).on('error',err=>{
        
    })
}

10,socket双全工通信

const net = require('net');
//回调函数中的定义函数,每当收到一个 TCP连接,都会调用一次这个回调函数。
const server = net.createServer((socket) => {
  // 'connection' listener
  console.log('client connected');
  var date = new Date();
    var seperator1 = "-";
    var seperator2 = ":";
    var month = date.getMonth() + 1;
    var strDate = date.getDate();
    if (month >= 1 && month <= 9) {
        month = "0" + month;
    }
    if (strDate >= 0 && strDate <= 9) {
        strDate = "0" + strDate;
    }
    var currentdate = date.getFullYear() + seperator1 + month + seperator1 + strDate
            + " " + date.getHours() + seperator2 + date.getMinutes();
    
  //写入
  socket.write(currentdate+'\n');
  socket.pipe(socket);
  //手动结束,否则.net服务器会一直开着接收TCP信号
  socket.end();
});
//监听端口为命令行第一个参数
server.listen(process.argv[2], () => {
    
});

11,HTTP文件服务器

var http = require('http')
var fs = require('fs')

var server = http.createServer((req,res)=>{
    res.writeHead(200, {'Content-Type': 'text/plain'});
    //文件模块的创建写入流
    var str = fs.createReadStream(process.argv[3])
    //连接文件写入流和http响应流,写入的文件会在res里显示出来
        str.pipe(res)
    res.end(()=>{});
})

server.listen(process.argv[2])

12,HTTP大写转化器

最近十九大,翻不出去。。,cnpm也失效了,这个题要安装模块through2-map,转化为大写用字符串的toUpperCase()好了

13,JSON api服务器

var http = require('http')
var url = require('url');
var querystring = require('querystring');

http.createServer(function(req,res){
    var obj = url.parse(req.url); //解析请求的url
    var param = querystring.parse(obj.query); //获取请求url中的query参数,并转为对象格式
    res.writeHead(200, { 'Content-Type': 'application/json' });
    //通过pathname判断调用的是哪个接口
        if('/api/parsetime'===obj.pathname){
         //当传入的是正规时间时
        var date = new Date(param.iso);
        var retObj = {
          hour: date.getHours(),
          minute: date.getMinutes(),
          second: date.getSeconds()
            }; //返回时间对象
        res.end(JSON.stringify(retObj));
    }
    if('/api/unixtime'===obj.pathname){
         //当传入的是时间戳时
        var date = new Date(param.iso);
        var retObj = {unixtime: date.getTime()};
        res.end(JSON.stringify(retObj));
    }
}).listen(process.argv[2]);

初探node,路漫漫而修远。。


nodeschool学习_第1张图片
DQUD%VD~SG(BIDWWZYSNK%1.jpg

你可能感兴趣的:(nodeschool学习)