安利一個學(xué)習(xí)node.js的網(wǎng)址
Nodeschool 教你 Web 開發(fā)技能的開源課程嫉嘀,自學(xué)或者參加一個附近的教學(xué)活動。
里面的node初級教程一共13個task杭措,學(xué)下來應(yīng)該收獲頗豐视搏。
1,在node環(huán)境編譯js
2盟广,獲取命令行輸入的參數(shù)
let arr = []
function add(arr){
for(var i = 2 ; i < process.argv.length ; i++){
//從第三個參數(shù)開始才是我們輸入的參數(shù)
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獲取參數(shù)數(shù)組,reduce函數(shù)累加獲取總數(shù)
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過濾器
繼續(xù)了解node的fa和path模塊年叮,讀取目錄文件(readdir),輸出特定后綴格式的文件(extname)
6只损,使其模塊化
module代碼
//接收兩個參數(shù)一姿,通過module.exports導(dǎo)出,遵循commonJs規(guī)范
//這里提一下跃惫。叮叹。。
//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)
}
}
//傳遞的參數(shù)中可傳回調(diào)函數(shù)悼粮,參數(shù)可以后面再寫,空的參數(shù)以null替代
return callback(null,fileList)
})
}
導(dǎo)入代碼
//模塊所依賴的模塊已經(jīng)自行導(dǎo)入曾棕,再使用時不必導(dǎo)入
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=>{
//直接爬下網(wǎng)站的html文檔了
console.log(data)
})
res.on('end',()=>{
console.log('請求結(jié)束')
})
}).on('error',err=>{
console.log('請求失敗')
})
8,HTTP收集器
get請求到的資源不是一次性收集到的翘地,而是一段一段慢慢傳過來的申尤,將每一段在res.on('data')中監(jiān)聽起來,在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衙耕,異步回調(diào)
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=>{
//直接爬下網(wǎng)站的html文檔了
data += res
})
res.on('end',()=>{
console.log(data)
index += 1
//遞歸也能處理
getInfor()
})
}).on('error',err=>{
})
}
10昧穿,socket雙全工通信
const net = require('net');
//回調(diào)函數(shù)中的定義函數(shù),每當(dāng)收到一個 TCP連接臭杰,都會調(diào)用一次這個回調(diào)函數(shù)粤咪。
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);
//手動結(jié)束,否則.net服務(wù)器會一直開著接收TCP信號
socket.end();
});
//監(jiān)聽端口為命令行第一個參數(shù)
server.listen(process.argv[2], () => {
});
11渴杆,HTTP文件服務(wù)器
var http = require('http')
var fs = require('fs')
var server = http.createServer((req,res)=>{
res.writeHead(200, {'Content-Type': 'text/plain'});
//文件模塊的創(chuàng)建寫入流
var str = fs.createReadStream(process.argv[3])
//連接文件寫入流和http響應(yīng)流寥枝,寫入的文件會在res里顯示出來
str.pipe(res)
res.end(()=>{});
})
server.listen(process.argv[2])
12,HTTP大寫轉(zhuǎn)化器
最近十九大磁奖,翻不出去囊拜。。比搭,cnpm也失效了冠跷,這個題要安裝模塊through2-map,轉(zhuǎn)化為大寫用字符串的toUpperCase()好了
13身诺,JSON api服務(wù)器
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參數(shù)蜜托,并轉(zhuǎn)為對象格式
res.writeHead(200, { 'Content-Type': 'application/json' });
//通過pathname判斷調(diào)用的是哪個接口
if('/api/parsetime'===obj.pathname){
//當(dāng)傳入的是正規(guī)時間時
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){
//當(dāng)傳入的是時間戳?xí)r
var date = new Date(param.iso);
var retObj = {unixtime: date.getTime()};
res.end(JSON.stringify(retObj));
}
}).listen(process.argv[2]);
初探node,路漫漫而修遠(yuǎn)霉赡。橄务。
DQUD%VD~SG(BIDWWZYSNK%1.jpg