安利一个学习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,路漫漫而修远。。