安裝:
新版本中命令行工具分家了
npm install-g express//安裝 express
然后
npm install-g express-generator//安裝 express 命令行工具
express -V
我現(xiàn)在查看到的版本是 4.9.0
npm start? 代替? node app.js? 啟動
http.Server
var http = require(‘http’);
var server = http.createServer(callback); 返回一個http.Server實例
屬性:
server.maxHeadersCount? ? 最大請求頭數(shù)目限制, 默認(rèn) 1000 個. 如果設(shè)置為0, 則代表不做任何限制
方法:
server.listnen(prot)? ? ? ? ? ? 監(jiān)聽一個端口
server.close(callback)? ? ? ? ? 禁止服務(wù)端接收新的連接
server.setTimeout(msecs_Time, callback) 設(shè)置套接字的超時值
事件:
‘request’ 每收到一個HTTP請求時觸發(fā), http.createServer的參數(shù)默認(rèn)就是此事件的處理程序. 提供2個參數(shù): req, res 分別是http.ServerRequest 和 http.ServerResponse 的實例. 表示請求和響應(yīng)消息
‘connection’ 新的TCP建立時觸發(fā). 提供1個 socket 參數(shù) net.Socket 實例
‘close’ 服務(wù)器關(guān)閉時觸發(fā) 無參
http.ServerRequest
HTTP請求的消息, 一般由 http.Server的 request 事件發(fā)送.
HTTP 請求分: 請求頭.? 請求體
事件:
‘data’? ? 請求體數(shù)據(jù)來到時. 參數(shù) chunk 表示接收到的數(shù)據(jù)
’end’ ? ? 請求體數(shù)據(jù)傳輸完成時
’close’ 用戶當(dāng)前請求結(jié)束時
屬性:
complete? ? ? 客戶端請求是否已經(jīng)發(fā)送完成
httpVersion? HTTP 協(xié)議版本,通常是 1.0 或 1.1
method? HTTP 請求方法震糖,如 GET硝岗、POST萎馅、PUT、DELETE 等
url? ? ? 原始的請求路徑丈氓,例如 /static/image/x.jpg 或 /user?name=byvoid
headers? HTTP 請求頭
trailers? HTTP 請求尾(不常見)
connection? 當(dāng)前 HTTP 連接套接字旧乞,為 net.Socket 的實例
socket? connection 屬性的別名
client? client 屬性的別名
params? ? ? ? ? 多路由控制時的對象
http.ServerResponse
HTTP響應(yīng)消息是返回給客戶端的信息,決定了用戶最終看到的結(jié)果
函數(shù)
res.writeHead(statusCode, [headers])? 該函數(shù)在一次請求中最多調(diào)用一次. statusCode, 是HTTP狀態(tài)碼. 如200,404.? headers 類似數(shù)組的對象,表示響應(yīng)頭的每個屬性
res.write(data, [encoding])? ? ? ? ? 發(fā)送響應(yīng)內(nèi)容, 如果是字符串,需要制定編碼方式, 默認(rèn) utf-8
res.end(data, data, [encoding])? ? ? 結(jié)束響應(yīng),告知客戶端所有響應(yīng)完成. 此函數(shù)必須調(diào)用一次
API
HTTP動詞都是Express的方法. post 改、put 增茧痒、delete 刪、get 查
GET
GET 根據(jù)請求路徑來處理客戶端發(fā)出的GET請求
app.get(path, [callback(request, response)])
ALL
ALL 以匹配所有的HTTP動詞融蹂,也就是說它可以過濾所有路徑的請求
app.all(path, [callback(request, response, next)])
USE
USE express調(diào)用中間件的方法,它返回一個函數(shù). path默認(rèn)為"/"
app.use([path], [callback(request, response, next)])
USE 不僅可以調(diào)用中間件,還可以根據(jù)請求的網(wǎng)址弄企,返回不同的網(wǎng)頁內(nèi)容
app.use(function(request,response,next){if(request.url=="/"){response.send("Welcome to the homepage!");}else{next();}});app.use(function(request,response,next){if(request.url=="/about"){response.send("Welcome to the about page!");}else{next();}});app.use(function(request,response){response.send("404 error!");});
post
處理指定頁面的post請求
app.post(path,function(req, res));
想要使用 body 需要安裝中間件
npm install body-parser
npm install multer
調(diào)用
var bodyParser = require(‘body-parser’);
var multer = require(‘multer’);
…
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
app.use(multer());
req.body 解析客戶端的post請求參數(shù)
格式:req.body.參數(shù)名超燃;
注意: 表單所發(fā)送的 post請求 Accept 和 ajax 的不一樣
服務(wù)器 send 發(fā)回來的數(shù)據(jù),ajax是數(shù)據(jù), 表單會反映稱網(wǎng)頁
param/query/params
獲取主機(jī)名、路徑名.[這里的req就是回調(diào)函數(shù)中的第一個參數(shù)]
req.host 返回請求頭里取的主機(jī)名(不包含端口號);
req.path 返回請求的URL的路徑名
req.query 是一個對象,存儲著get請求路徑參數(shù)的對象屬性
www.***.com/shoes?order=desc&shoe[color]=blue&shoe[type]=converse? 網(wǎng)址
得到: { order: ‘desc’, shoe: { color: ‘blue’, type: ‘converse’ } }
req.param() 功能同上,不過是函數(shù)形式 req.param(‘order’) 返回 desc
// req.param('name') 還可以獲取具有相應(yīng)路由規(guī)則的請求對象app.get("/user/:name/",function(req,res){console.log(req.param("name"));res.send("使用req.param屬性獲取具有路由規(guī)則的參數(shù)對象值!");});
// req.params 同上,但可以匹配復(fù)雜命名路由規(guī)則的請求app.get("/user/:name/:id",function(req,res){console.log(req.params.id);});
send
send 方法向瀏覽器發(fā)送一個響應(yīng)信息拘领,并可以智能處理不同類型的數(shù)據(jù) send方法在輸出響應(yīng)時會自動進(jìn)行一些設(shè)置意乓,比如HEAD信息、HTTP緩存支持等等 類型可以是: String, Array, Object, Number. 當(dāng)參數(shù)為一個String時,Content-Type默認(rèn)設(shè)置為"text/html" 當(dāng)參數(shù)為Array或Object時届良,Express會返回一個JSON 當(dāng)參數(shù)為一個NumberExpress會幫你設(shè)置一個響應(yīng)體笆凌,比如:200
set
app.set(‘view engine’, ‘ejs’);? 設(shè)置默認(rèn)模板引擎
app.engine( ‘.html’, require( ‘ejs’ ).__express ); 修改模板引擎
"__express",ejs模塊的一個公共屬性士葫,表示要渲染的文件擴(kuò)展名
app.set(‘views’, __dirname);? 設(shè)定views變量乞而,意為視圖存放的目錄
express.static —— 指定靜態(tài)文件的查找目錄
app.use(express.static(require(‘path’).join(__dirname, ‘public’)));
模板操作:
app.set(‘views’, path.join(__dirname, ‘views’));
app.set(‘view engine’, ‘html’);
app.engine(’.html’, require(‘ejs’).__express);
這樣模板后綴可以使 .html? 但模板代碼是ejs代碼
render
何對網(wǎng)頁模板進(jìn)行訪問. res對象的render函數(shù)
res.render(view, [locals], callback);
view 視圖名, locals 為模板傳入變量
redirect
允許網(wǎng)址的重定向,跳轉(zhuǎn)到指定的url并且可以指定status慢显,默認(rèn)為302方式
根據(jù)指定url來重定向爪模,可以域內(nèi)路徑、網(wǎng)頁間跳轉(zhuǎn)也可以跳轉(zhuǎn)至不同域名
res.redirect([status], url);
res.redirect(“l(fā)ogin”);
Middleware<中間件>
中間件(middleware)就是處理HTTP請求的函數(shù)荚藻,用來完成各種特定的任務(wù)屋灌,比如檢查用戶是否登錄、分析數(shù)據(jù)应狱、以及其他在需要最終將數(shù)據(jù)發(fā)送給用戶之前完成的任務(wù)共郭。 它最大的特點就是,一個中間件處理完疾呻,可以把相應(yīng)數(shù)據(jù)再傳遞給下一個中間件除嘹。
//連續(xù)調(diào)用2個中間件app.use(function(request,response,next){console.log("method:"+request.method+" ==== "+"url:"+request.url);next();});app.use(function(request,response){response.writeHead(200,{"Content-Type":"text/html;charset=utf-8"});response.end('示例:連續(xù)調(diào)用兩個中間件');});
由于這種原因,所以調(diào)用中間件的順序非常重要
設(shè)定靜態(tài)文件目錄的訪問路徑
express.static(path.join(__dirname, ‘/public’))
express-session
varsession=require('express-session');app.use(session({secret:'secret',resave:true,saveUninitialized:false,cookie:{maxAge:1000*60*10//過期時間設(shè)置(單位毫秒)}}));//新增中間件并設(shè)置模板變量值app.use(function(req,res,next){res.locals.user=req.session.user;varerr=req.session.error;res.locals.message='';if(err)res.locals.message='
'+err+'
';next();});
body-parser
npm install body-parser
npm install multer調(diào)用varbodyParser=require('body-parser');varmulter=require('multer');......app.use(bodyParser.json());app.use(bodyParser.urlencoded({extended:true}));app.use(multer());