1. 程式人生 > >將js進行到底:node學習6

將js進行到底:node學習6

方便 json 終端 type ejs jsb count 常用 amp

開始真正的node web開發——express框架

為何說現在才是web開發的真正開始呢?

首先任何企業都不會用原生的http協議API去開發一個完整的網站,除非她們先開發一個框架出來,其次我們之前的所謂http,connect都只是打開了一個http服務器而已,頂多只能算個工具集(中間件),最後使用像express這樣的框架使我們把精力集中到功能業務上來了!

生產力因此而得以體現!

引入express

上一章,即便我們已經可以使用connect處理用戶各種請求了,但依然需要我們人為的去關註路由,文件判斷,並且connect,serve-static只是起到了純中間作用,且拼拼湊湊組合出一個看上去還不錯的網站,這些並沒有直接加強HTTP這個API。

可以發現我們依然在使用 require("http").createServer()" 來創建http服務

package.json

{
    "name":"test-express",
    "version":"0.0.1",
    "description":"an express example",
    "dependencies":{
        "express":"latest",
        "jade":"latest"
    }
}
npm install

Express是直接在http上加強的,封裝了http API,我們不必再為http API缺少操心了

Express創建HTTP服務器

var express = require("express");
var app = express();

app.get(‘/‘,function(req,res){
    res.send("hello world");
});

app.listen(3000);

可以看到express模塊暴露的express方法本身,返回一個對象,其get方法已經解決了路徑處理的問題。這是一個非常簡單的示例頁面,已經讓我感受到了他將會使得web開發變得十分簡單。

Express托管靜態文件

使用express框架express.static來對上一回中的serve-static托管靜態文件做修改,必須說明的是:express.static 是 Express 內置的唯一一個中間件。是基於 serve-static 開發的,負責托管 Express 應用內的靜態資源。(官網說明)

新建一個public目錄專門存放靜態文件:css,js,images等資源文件都可以

app.use(express.static(‘public‘));

只需要一行代碼,測試效果

技術分享圖片

Express視圖業務分離——模板渲染引擎Jade

在剛開始開發web那會,我一直無法理解php的smarty是什麽,在開發了javaee之後,慢慢熟悉了一個名詞“模板引擎”,由於php本身可以內嵌html所以,很容易讓初學者忽視了這個模板引擎的概念,後來,開發java之時,我們需要將前端(html)後端(java)進行分離的時候,就需要接觸到模板引擎了,主要作用:

在純html文件中輸入規定格式的變量或者邏輯語言,在經過http發送給客戶端瀏覽器前將其中的變量標記替換為對應的值,並且將邏輯語言編程,最終生成純html文件流發送給客戶端。

通俗言之:模板引擎像一個加工模具,將非純html(帶模板代碼)裝入,生成新的,完善的純html代碼,這樣我們不需要在html中直接嵌入後端語句來動態修改頁面,這實現了邏輯和視圖的分離(模板引擎是動態網站的核心內容之一)

舉個栗子,使用Jade模板引擎!(需要外部模塊,前面package.json中已經加入了)

首先模板存放位置,新建:views目錄->新建index.jade文件

前端index.jade

doctype   
html  
    head  
        title= pageTitle  
        script(type=‘text/javascript‘).  
            function showCityEx(city)  
            {  
                return city + " & " + city;  
            }  
          
    body  
        h1 #{h1}  
      
        table(border=1)  
            tr  
                th hello  
                th world,citys.count=#{cscores.length + 3}  
                th count  
            for city,index in citys  
                tr  
                    td= index  
                    td welcome to #{city}(#{city.substr(0,4)})  
                    td= cscores[index]  
        div over!  

後端:index.js

var express = require("express");
var app = express();

var city_names = [  
    ‘wuhan‘,  
    ‘tianjin‘,  
    ‘beijing‘,  
    ‘shanghai‘  
];
var city_scores = [  
    ‘60‘,  
    ‘62‘,  
    ‘80‘,  
    ‘70‘  
];
app.use(express.static(‘public‘));
app.set("view engine","jade");
app.set("views",__dirname+"/views");

app.get(‘/‘,function(req,res){
    res.render("index",{citys:city_names,cscores:city_scores});
});

app.listen(3000);

解釋

學習express先不理會那些jade模板代碼,如需了解,參考Jade官網API:http://jade-lang.com/

重心放在nodejs代碼上,app.get方法並沒有改變,參數URL綁定了參數回調函數。

res調用了render,是模板引擎渲染方法,表示向客戶端輸出一個渲染後的html

  1. 配置一:使用app.set可以配置express,將view engine設置為jade
  2. 配置二:將模板存放位置配置為:views目錄,我們將jade文件放在裏面,以後自動讀取
  3. render參數一:文件名,不帶後綴
  4. render參數二:jade模板中需要替換掉的變量
  5. render還有一個參數是回調函數,處理生成的html,可以這樣寫:
res.render("index",function(err,html){
    //繼續處理html,比如打印到控制臺console.log(html);
});

模板引擎的基本使用套路無非就是:設置模板類型,設置模板目錄,render出來!

Jade模板語言本身值得我們單獨拿出來學習!

Express request與response

整個HTTP開發都圍繞著request(用戶請求)和response(響應請求)在做開發。

express為我們封裝了http的req與res對象,方便開發。

記錄一些常見的對象方法:

Request

如果直接打印req對象你會看到一堆亂七八糟東西,沒啥意思。

打印如下這些東西研究一下:

params對象

app.get(‘/user/:name‘,function(req,res){
    console.log(req.params.name);
})

地址欄輸入:http://localhost:3000/user/devil

終端顯示:

技術分享圖片

query對象

app.get(‘/user‘,function(req,res){
    console.log(req.query.name);
});

地址欄輸入:http://localhost:3000/user?name=devil

終端顯示:同上!

Response

download()

app.get(‘/getimg‘,function(req,res){
    res.download(__dirname+"/public/images/xq.jpg");
});

用於下載文件,使用後強制用戶下載該文件

json()和jsonp()

app.get(‘/json‘,function(req,res){
    res.json({name:"devil",sex:"男",body:"strong"});
});

強制將js對象轉換為json數據格式發送給客戶端,後者則支持jsonp,效果一樣。

redirect()

app.get(‘/baidu‘,function(req,res){
    res.redirect(‘http://www.baidu.com‘);
});

重定向到其他頁面

send()

app.get(‘/send‘,function(req,res){
    res.send({some:‘json‘});
});

send是express非常常用的方法,功能巨多,優點是可自動轉化格式,輸入數字發送狀態碼,輸入字符串返回客戶端字符串,輸入js對象返回json對象,他能對參數數據類型做很好的判斷,要優於上述json()方法。

sendFile()

app.get(‘/send‘,function(req,res){
    res.sendFile("E:\\視頻\\電影\\v字仇殺隊.mp4");
});

這個就有意思了,是發送文件,但並不會使得用戶下載,應該是以二進制流的方式發送文件,理論上還需要瀏覽器支持,測試後效果:

技術分享圖片

如果是圖片文件,則顯示圖片。

將js進行到底:node學習6