Express框架

Express是一個簡潔、靈活的nodejs web應用開發框架,它提供一系列強大的功能使咱們能夠快速的開發一個web應用。javascript

安裝npm install expresscss

安裝express命令行工具,能夠初始化一個express項目html

npm install -g express-generatorjava

執行express -e my_express_project 建立一個express項目,建立成功後根據命令行提示執行命令node

路由控制git

根據請求路徑來處理客戶端發出的get請求 app.get(path,function(request,response))github

app.all()函數能夠匹配全部的HTTP動詞,也就是說它能夠匹配全部路徑的請求web

路由處於整個架構的樞紐位置,至關於各個接口之間的粘合劑,因此在項目規劃時,應該優先考慮express

/** * 1.安裝 * 2.使用 */
//加載express
var express = require('express'); //獲取配置對象
var app = express(); //配置路由 //當用戶訪問/的時候,會執行後面的回調函數
app.get('/hello',function(req,res){ //send是express提供的方法,它能夠自動判斷參數類型,自動轉換響應信息。一旦匹配成功,就不會執行後面的路由配置。send包含end方法
    //而且自動設置Content-Type
    res.send('get hello'); }); app.post('/hello',function(req,res){
    res.send('post hello'); }); app.all('/hello',function(req,res){
    res.send('all hello'); }); //啓動服務器
app.listen(3000);

中間件npm

中間件就是處理HTTP請求的函數,用來完成各類特定的任務,好比檢查用戶是否登陸、添加公共方法、記錄日誌等。

中間件最大的特色就是,一箇中間件處理完,能夠把相應數據再傳遞給下一個中間件。

//加載express
var express = require('express'); //獲取配置對象
var app = express(); //計算一個處理請求一共花了多少時間 /** * 開始時間 */ app.use(function(req,res,next){ res.start = Date.now(); //console.time('cost');
    //暫存原來的end方法
   var originalEnd = res.end; //爲res.end從新賦值爲咱們自定義函數
    res.end = function(){ //先把原來的end方法調用一次
 originalEnd.apply(res,Array.prototype.slice.call(arguments)); //加入本身的小邏輯
        console.timeEnd('cost') // console.log('timecost',Date.now() - res.start);
 } next(); }); //中央
app.use('/money',function(req,res,next){ res.mny = 100; next(); }); //省裏,下面的路徑不匹配,因此下面的中間件不會執行
app.use('/hello',function(req,res,next){ res.mny = res.mny - 10; next(); }); //市裏
app.use('/money',function(req,res,next){ res.mny = res.mny - 30; next(); }); //村,在這一層,若是調用next()而且不調用send(),會執行到get方法。如今這種寫法不會執行到get路由配置那裏。狀態碼返回會以狀態短語’Not Found‘顯示
app.use(function(req,res,next){ res.mny = res.mny - 60; res.send(404); }); //好比中央要給農民發送補貼100元。send方法不能返回數字,以此避免與狀態碼衝突,
app.get('/money',function(req,res){ res.send(""+res.mny); }); app.listen(8080);

app就是個配置,裏面放了函數隊列,上述例子中先經過use方法放了三個中間件函數,再經過路由配置了一個函數。接收到請求的時候,會從上往下依次執行,每層均可以決定是否繼續向下執行。use方法的第三個參數next方法若是調用,則能夠繼續向下走,若是不執行use方法中的next方法,則不會繼續向下執行。

獲取請求參數

req.host返回請求頭裏取的主機名(不包含端口號)

req.path返回請求的URL的路徑名

req.query是一個可獲取客戶端get請求查詢字符串轉成的對象,默認爲{}

req.params是一個路徑參數組成的對象

var express = require('express'); //獲取配置對象
var app = express(); // localhost:8080/hello?name=zfpx
app.get('/hello',function(req,res){ //var urlObj = url.parse(req.url,true); console.log(req.host);//主機名
    console.log(req.path);// 路徑 urlObj.pathname
    console.log(req.query);// urlObj.query
    res.send('歡迎來到首頁'); }); //路徑參數 把向服務器端傳遞的參數放在路徑裏 正則匹配。localhost:8080/user/id/age
app.get('/user/:id/:age',function(req,res){ console.log(req.params.id); console.log(req.params.age); console.log(req.host); console.log(req.path); console.log(req.query); res.send('歡迎來到user'); }); app.listen(8080);

send方法

向瀏覽器發送響應,並能夠智能處理不一樣類型的數據。並在輸出響應時會自動進行一些設置,好比header信息、http緩存支持等

  ·當參數是一個String時,Content-Type默認設置爲text/html   

    res.send([body|status],[body])

  ·當參數爲Array或Object時,Express會返回一個JSON

  ·不能使用數字做爲參數,若是要返回狀態碼要用res.sendStatus方法

模板

  ·指定渲染模板引擎  app.set('view engine','ejs')

  ·設置放模板文件的目錄  app.set('views',path.join(__dirname,'/'))

  ·render函數,對網頁模板進行渲染 在渲染模板時locals可爲其模板傳入變量值,在模板中就能夠調用所傳變量了

    res.render(view,[locals],callback);

var express = require('express'); var path = require('path'); var app = express(); /** * 1. 動態內容 當前時間 * 2. 靜態內容 tmpl.html * 3. 動靜結合 */
//配置屬性值 //配置模板引擎 先執行npm install ejs // jade ejs
app.set('view engine','ejs'); //指定模板存放的目錄 // 模板文件放在views文件夾下,resolve 先獲取當前文件的所在在絕對目錄 ,而後再拼上後面的參數。
app.set('views',path.resolve('views')); app.get('/',function(req,res){ //把模板和數據混合成HTML頁面 express提供的render方法對模板進行渲染 ejs語法 <%變量名%>
    res.render('index.ejs',{title:'首頁',books:{ name:'node.js' }}); }); app.get('/reg',function(req,res){ res.render('index',{title:'註冊'}); }); app.listen(8080);

ejs模板

ejs的標籤系統很是簡單,只有三種標籤:

<%code%>:javascript代碼

<%=code%>:顯示替換過HTML特殊字符的內容

<%-code%>:顯示原始HTML內容,當code爲普通字符串時與<%=code%>沒有區別

<%- include include/header%>這種片斷引入其餘html片斷的ejs文件

<body>
<%=title%>
<%=books.name%>
<%
 for(var i=0;i<10;i++){
     %>
      <h1>hello</h1>
    <%
 }
%>
</body>

模板原理

//渲染模板
function render(tmpl,data){ //用真實的值替換佔位變量 
    return tmpl.replace(/\{\{(\w+)\}\}/,function(matched,group1){ console.log(arguments); return data[group1]; }) }//把模板裏的變量替換成對象裏的屬性,變量和屬性名必定要相同
var result = render('<h1>{{title}}</h1>',{title:'歡迎'}); console.log(result);

 靜態文件服務中間件

express.static是Express內置的惟一一箇中間件,負責託管Express應用內的靜態資源

  ·若是要在網頁中加載靜態文件(css,js,img),就須要另外指定一個存放靜態文件的目錄

  ·項目目錄下添加一個存放靜態文件的目錄爲public

  ·在public目錄下再添加三個js、css、img的目錄,把相關文件放到相應的目錄下

  ·當瀏覽器發出文件請求時,服務器端就會到這個目錄下去尋找相關文件

    app.use(express.static(require('path').join(__dirname,'public')),{options})

var express = require('express'); var path = require('path'); var fs = require('fs'); var app = express(); /*app.use(function(req,res,next){ fs.createReadStream(__dirname+'/public'+req.url).pipe(res); });*/
//參數的值是靜態文件目錄的根目錄 中間件是經過use方法調用的
app.use(express.static(__dirname+'/public')); app.listen(8080);

 post方法

根據請求路徑來處理客戶端發出的post請求

  var bodyParser = require('body-parser');

  app.use(bodyParser.urlencoded({extended:true}))

  app.post(path,function(req,res));

req.body屬性解析客戶端的post請求參數,經過它能夠獲取請求路徑的參數值

var express = require('express'); var app = express(); app.use(express.static(__dirname)); var bodyParser = require('body-parser'); //extended 爲true時,用querystring,若是爲false會用bodyParser本身的轉換方法 // 若是請求頭裏的content-type是application/x-www-form-urlencoded, 會用此中間件轉成對象放到req.body上,不然 什麼都不作
app.use(bodyParser.urlencoded({extended:true}));//此中間件會把請求體提取出來放到req.body上 //若是請求頭裏的content-type是application/json的時候,, 會用此中間件轉成對象放到req.body上,不然 什麼都不作 //app.use(bodyParser.json());
app.post('/reg',function(req,res){ //把請求體裏的數據轉變成對象放在req.body上
 console.log(req.body); res.end('reg'); }); app.listen(8080);

---------------------------------------------------------------------------------------

項目建立成功後提交到本地倉庫

  ·git init初始化倉庫

  ·git add -A把全部的文件添加到暫存區

  ·git commit -m'初始化個人express項目'把全部的修改添加到歷史區

建立遠程倉庫

  ·登陸github

  ·建立一個新項目

  ·注意不要勾選initailize this repository width a README前面的複選框

  ·也不要去下拉框裏選擇.gitignore或license

  ·要保持默認,直接點擊create repository

推送到遠程倉庫

  ·git remote add origin https://github.com/fengmin0603/myBlog.git添加遠程倉庫的關聯

  ·git push -u origin master把本地的倉庫推送到遠程服務器上去   -u是把本地master分支和遠程master分支關聯起來

----------------------------------------------------------------------------------------------

生成文件說明

app.js:express的主配置文件

package.json:存儲着工程的信息及模塊依賴,當在dependences中添加依賴的模塊時,運行npm install ,npm會檢查當前目錄下的package.json,並自動安裝全部指定的模塊

node_modules:存放着package.json中安裝的模塊,當在package.json中添加依賴的模塊並安裝後,存在在這個文件夾下

public:存放image、css、js等文件

routes:存放路由文件

views:存放視圖文件或者說模板文件

bin:可執行文件,能夠從這裏啓動服務器

相關文章
相關標籤/搜索