將js進行到底:node學習6
開始真正的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
- 配置一:使用app.set可以配置express,將view engine設置為jade
- 配置二:將模板存放位置配置為:views目錄,我們將jade文件放在裏面,以後自動讀取
- render參數一:文件名,不帶後綴
- render參數二:jade模板中需要替換掉的變量
- 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