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