二、第一個 Express 框架例項
目標
使用 Express 框架,當在瀏覽器中訪問 http://localhost:3000/ 時,輸出 Hello World
安裝express
$ npm install express
新建一個 app.js 檔案
// 這句的意思就是引入 `express` 模組,並將它賦予 `express` 這個變數等待使用。 var express = require('express'); // 呼叫 express 例項,它是一個函式,不帶引數呼叫時,會返回一個 express 例項,將這個變數賦予 app 變數。 var app = express(); // app 本身有很多方法,其中包括最常用的 get、post、put/patch、delete,在這裡我們呼叫其中的 get 方法,為我們的 `/` 路徑指定一個 handler 函式。 // 這個 handler 函式會接收 req 和 res 兩個物件,他們分別是請求的 request 和 response。 // request 中包含了瀏覽器傳來的各種資訊,比如 query 啊,body 啊,headers 啊之類的,都可以通過 req 物件訪問到。 // res 物件,我們一般不從裡面取資訊,而是通過它來定製我們向瀏覽器輸出的資訊,比如 header 資訊,比如想要向瀏覽器輸出的內容。這裡我們呼叫了它的 #send 方法,向瀏覽器輸出一個字串。 app.get('/', function (req, res) { res.send('Hello World'); }); // 定義好我們 app 的行為之後,讓它監聽本地的 3000 埠。這裡的第二個函式是個回撥函式,會在 listen 動作成功後執行,我們這裡執行了一個命令列輸出操作,告訴我們監聽動作已完成。 app.listen(3000, function () { console.log('app is listening at port 3000'); });
執行
$ node app.js
這時候我們的 app 就跑起來了,終端中會輸出 app is listening at port 3000。這時我們開啟瀏覽器,訪問 http://localhost:3000/
,會出現 Hello World。
Express框架
載入express 然後使用程式碼 express()建立一個新的應用程式:
var express = require('express');
var app = express();
路由方法
路由方法派生自 HTTP 方法之一,附加到 express 類的例項。
以下程式碼是為訪問應用程式根目錄的 GET 和 POST 方法定義的路由示例。
// GET method route
app.get('/', function (req, res) {
res.send('GET request to the homepage');
});
// POST method route —— 根據請求路徑來處理客戶端發出的Post請求。
app.post('/', function (req, res) {
res.send('POST request to the homepage');
});
Express 支援對應於 HTTP 方法的以下路由方法:get、post、put、head、delete、options、trace、copy、lock、mkcol、move、purge、propfind、proppatch、unlock、report、mkactivity、checkout、merge、m-search、notify、subscribe、unsubscribe、patch、search 和 connect。
路由路徑
路由路徑與請求方法相結合,用於定義可以在其中提出請求的端點。路由路徑可以是字串、字串模式或正則表示式。
基於字串的路由路徑
此路由路徑將請求與根路由 / 匹配。
app.get('/', function (req, res) {
res.send('root');
});
此路由路徑將請求與 /about 匹配。
app.get('/about', function (req, res) {
res.send('about');
});
此路由路徑將請求與 /random.text 匹配。
app.get('/random.text', function (req, res) {
res.send('random.text');
});
此路由路徑將匹配 acd 和 abcd。
app.get('/ab?cd', function(req, res) {
res.send('ab?cd');
});
此路由路徑將匹配 abcd、abbcd、abbbcd 等。
app.get('/ab+cd', function(req, res) {
res.send('ab+cd');
});
此路由路徑將匹配 abcd、abxcd、abRABDOMcd、ab123cd 等。
app.get('/ab*cd', function(req, res) {
res.send('ab*cd');
});
此路由路徑將匹配 /abe 和 /abcde。
app.get('/ab(cd)?e', function(req, res) {
res.send('ab(cd)?e');
});
基於正則表示式的路由路徑
此路由路徑將匹配名稱中具有“a”的所有路由。
app.get(/a/, function(req, res) {
res.send('/a/');
});
此路由路徑將匹配所有以fly結尾的字串 xfly、 butterfly,但是不匹配 butterflyman、dragonfly man 等。
app.get(/.*fly$/, function(req, res) {
res.send('/.*fly$/');
});
路由處理程式
單個回撥函式可以處理一個路由
app.get('/example/a', function (req, res) {
res.send('Hello from A!');
});
多個回撥函式可以處理一個路由(確保您指定 next 物件)
app.get('/x/b', function (req, res, next) {
console.log('the response will be sent by the next function ...');
next();
console.log('111'); // next()執行完之後再列印
}, function (req, res) {
console.log('222');
res.send('Hello from B!');
console.log('333');
});
獨立函式與一組函式的組合可以處理一個路由。例如:
var cb0 = function (req, res, next) {
console.log('CB0');
next();
}
var cb1 = function (req, res, next) {
console.log('CB1');
next();
}
app.get('/example/d', [cb0, cb1], function (req, res, next) {
console.log('the response will be sent by the next function ...');
next();
}, function (req, res) {
res.send('Hello from D!');
});
響應方法
下表中響應物件 (res) 的方法可以向客戶機發送響應,並終止請求/響應迴圈。如果沒有從路由處理程式呼叫其中任何方法,客戶機請求將保持掛起狀態。
方法 | 描述 |
---|---|
res.download() | 提示將要下載檔案 |
res.end() | 結束響應程序 |
res.json() | 傳送 JSON 響應 |
res.jsonp() | 在 JSONP 的支援下發送 JSON 響應 |
res.redirect() | 重定向請求 |
res.render() | 呈現檢視模板 |
res.send() | 傳送各種型別的響應 |
res.sendFile | 以八位元流形式傳送檔案 |
res.sendStatus() | 設定響應狀態碼並以響應主體形式傳送其字串表示 |