一、什么是node.js
1薄榛、node.js
1.Node.js 就是運(yùn)行在服務(wù)端的 JavaScript
2.Node.js 是一個(gè)基于Chrome JavaScript 運(yùn)行時(shí)建立的一個(gè)平臺者吁。
3.Node.js是一個(gè)事件驅(qū)動I/O服務(wù)端JavaScript環(huán)境窘俺,基于Google的V8引擎,V8引擎執(zhí)行Javascript的速度非掣吹剩快瘤泪,性能非常好。
2育八、node的特點(diǎn)
1.異步I/O
```
$.post('url',,{title:'學(xué)習(xí)node的筆記'}对途,function(data){
console.log('收到相應(yīng)')
})
console.log('發(fā)送Ajax結(jié)束')
```
2.事件與回調(diào)函數(shù)
3.單線程
4.跨平臺
node.js創(chuàng)建第一個(gè)應(yīng)用
可以直接在命令行(黑窗口)運(yùn)行.js文件(不推薦使用)
最優(yōu)選擇:新建.js 文件
1.引入require模塊
var http = require('http');// const http = require('http');
2.創(chuàng)建服務(wù),服務(wù)器可以監(jiān)聽客戶端的請求
var server = http.createServer(function(req, res) {
console.log('111');
});
3.監(jiān)聽請求
server.listen(8081);
二髓棋、npm
npm由三部分組成
1.網(wǎng)站
2.注冊庫(registry)
3.命令行工具(CLI)
+ 網(wǎng)站是開發(fā)者使用npm的最基本方法掀宋,包括發(fā)現(xiàn)/查找package,編寫說明,管理他們的npm各個(gè)方面仲锄。
+ 注冊庫(registry)是一個(gè)關(guān)于package信息的一個(gè)巨大的庫劲妙。
+ CLI 通過命令行或者終端,這是開發(fā)者通過CLI與npm打交道的途徑儒喊。
實(shí)例——找到一個(gè)package
例如镣奋,假設(shè)你想為你的應(yīng)用找一個(gè)條形碼(二維碼),預(yù)期花費(fèi)數(shù)周時(shí)間來設(shè)計(jì)和實(shí)現(xiàn)怀愧,還不如去看下是否有人已經(jīng)上傳了一個(gè)二維碼的package侨颈。
1.從搜索框輸入值開始
2.相關(guān)選項(xiàng)將出現(xiàn)
3.或者點(diǎn)擊,去過濾更多的有可能的
4.當(dāng)你選擇一個(gè)package去探索芯义,更多的信息會展示出來哈垢,這些信息是package的作者寫的,很詳細(xì)扛拨。
5.現(xiàn)在你可以瀏覽開發(fā)者文檔耘分,去學(xué)習(xí)如何使用這些package。
三、文件系統(tǒng) fs
readFile('文件名',function(err,data){})
writeFile('文件名','新增內(nèi)容',function(err,data){})
同步和異步
// 異步讀取
fs.readFile('1.input.txt', function (err, data) {
if (err) {
return console.error(err);
}
console.log("異步讀取: " + data);
});
// 同步讀取
var data = fs.readFileSync('1.txt');
console.log("同步讀取: " + data.toString());
常用的語法
fs.open(path, flags[, mode], callback)
參數(shù):路徑求泰,打開文件的行為(只讀央渣、讀寫等),文件的模式渴频,回調(diào)
fs.open(path, flags[, mode], callback)
fs.close(fd, callback) // fd 通過 fs.open() 方法返回的文件描述符
四芽丹、get post
get 在url中 數(shù)據(jù)跟在url后邊的
post 不在url中 數(shù)據(jù)單獨(dú)發(fā)的
GET 數(shù)據(jù)解析
1、自己切
2.querystring xxx=xx&xx=xx
3.urlLib aa?xxx=xx&xx=12
urlLib.parse(url,true) pathname/query
url
const urlLib = require('url')
var obj = urlLib.parse('http://www.bufanui.com/index?a=2&b=5',true) //加上true 自動將query解析成json
console.log(obj);
Url {
protocol: 'http:',
slashes: true,
auth: null,
host: 'www.bufanui.com',
port: null,
hostname: 'www.bufanui.com',
hash: null,
search: '?a=2&b=5',
query: 'a=2&b=5',
pathname: '/index',
path: '/index?a=2&b=5',
href: 'http://www.bufanui.com/index?a=2&b=5' }
querystring
const querystring = require('querystring')
var json = querystring.parse("user=shi&pass=shi")
console.log(json);//{ user: 'shi', pass: 'shi' }
post
數(shù)據(jù)量大卜朗,url集中在內(nèi)容
分段發(fā)送
五拔第、模塊化
1、系統(tǒng)模塊:http/querystring/url
2场钉、自定義模塊:
3楼肪、包管理器(npm)
系統(tǒng)模塊:
斷言:Assert
Buffer
c/c++ 擴(kuò)展
Crypto 加密
Path 處理文件路徑
Stream 流操作
。惹悄。春叫。
自定義模塊
1.模塊的組成
require 請求,引入其他模塊的 (系統(tǒng)模塊泣港、自定義模塊)
modules 模塊,批量對外輸出
exports 輸出暂殖,對外輸出
2.npm (NodeJS Package Manager) 包管理器
1.統(tǒng)一下載途徑
2.自動下載依賴
3.node_modules 存放依賴
( 如果有./ 從當(dāng)前目錄找
如果不加./ 先從系統(tǒng)模塊找,再從node_modules找 )
自定義的模塊当纱,統(tǒng)一放在node_modules中
3.如何發(fā)布自己的模塊
創(chuàng)建一個(gè)新的文件夾呛每,npm init
編寫包的邏輯
npm publish,上傳成功坡氯,npm --force unpublish (取消發(fā)布)
注意:引入自己的模塊晨横,路徑加./
對外輸出內(nèi)容 ,必須加exports
js 可加可不加
六箫柳、express框架
簡潔而靈活的 node.js Web應(yīng)用框架
1.安裝
npm install express --save
2.配置
3.接受請求 get/post/use
4.響應(yīng)數(shù)據(jù)
非侵入式(增強(qiáng)式)
req req.url
res
原生 res.write()
express res.send() // 功能更多
優(yōu)勢:express 保留了原生的功能手形,添加了一些方法,增強(qiáng)原有的功能
使用三部曲:
1.創(chuàng)建服務(wù) var server = express()
2.監(jiān)聽 server.listen()
3.處理請求 server.use('地址'悯恍,function(req,res){})
處理請求三種方式:
get('/',function(req,res){})
post()
use() 融合兩種請求
中間件 (使用库糠、寫、鏈?zhǔn)剑? eg:express-static //設(shè)置靜態(tài)文件路徑
const static = require('express-static')
server.use(static('/'))
自己寫
server.use(function(req,res,next(){
var str = ''
req.on('data',function(){
str += data
})
req.on('end',function(){
req.body = querystring.parse(str);
next()
})
}))
處理數(shù)據(jù)
GET 無需中間件
req.query
POST 需要 body-parser
server.use(bodyParser.unlencode({})) //用于處理 JSON, Raw, Text 和 URL 編碼的數(shù)據(jù)
server.use(function(){
req.body
})
server.use(function(req,res,next(){
req.body
}))
鏈?zhǔn)讲僮? next() 下一個(gè)步驟
七涮毫、cookie
cookie
存在瀏覽器中 保存一些數(shù)據(jù)瞬欧,每次請求都會帶過來
不安全、有限(4K)
簽名罢防、加密
session
保存數(shù)據(jù)艘虎,保存在服務(wù)端
安全、足夠大
不能獨(dú)立存在咒吐、基于cookie實(shí)現(xiàn)的
cookie 中會有一個(gè)session的id野建、服務(wù)器利用session找到session文件属划、讀取寫入
隱患:session劫持
cookie
1、讀取 cookie-parser
server.use(cookieParser("相同的簽名 "))
server.use(function(){
req.cookies ==>未簽名的cookie
req.signedCookies 簽名
})
2贬墩、發(fā)送 response響應(yīng)回去的
res.secret = ''
res.cookie('名字','值',{
path:'/aaa', // 向上繼承
maxAge:30*24, // 毫秒
signed:ture // 是否簽名 簽名的密鑰
})
3妄呕、刪除
res.clearCookie('名字')
4陶舞、cookie-encrypter 加密
session
cookie-session
server.use(cookieParser())
server.use(cookieSession({
keys:['12','sss'],// 密鑰
maxAge: 3600*1000, // 毫秒
}))
server.use('/',function(){
req.session
})
delete res.session
1、寫入
2绪励、讀取
八肿孵、模板引擎 (渲染頁面)
jade -破壞式、強(qiáng)依賴 不保持原來html
render('字符串)
renderFile('文件名',參數(shù))
根據(jù)鎖進(jìn)疏魏,規(guī)定層級
屬性放在()停做,逗號分隔
style = {}
class = []
內(nèi)容 空格 依次
| 原樣輸出
. 所有的下一級 原樣輸出
include a.js
# {a+b } 輸出內(nèi)容
- var a = 5 / for
!標(biāo)簽正常輸出
ejs -非侵入式 保留式
<%= name %>
<%= 12+5 %>
<%= 'fefefe' %>
<%= json.arr[0].name %>