express api地址:http://www.expressjs.com.cn/starter/static-files.htmljavascript
一.安裝依賴html
npm i --save expressjava
npm i --save ejs (模板引擎)node
npm i --save jade (模板引擎)git
補充: npm init
命令爲你的應用建立一個 package.json
文件github
二.進入 myapp
目錄,建立一個名爲 app.js
的文件,而後將下列代碼複製進去:web
var express = require('express'); var app = express(); app.get('/', function (req, res) { res.send('Hello World!'); }); var server = app.listen(3000, function () { var host = server.address().address; var port = server.address().port; console.log('Example app listening at http://%s:%s', host, port); });
上面的代碼啓動一個服務並監遵從 3000 端口進入的全部鏈接請求。他將對全部 (/
) URL 或 路由 返回 「Hello World!」 字符串。對於其餘全部路徑所有返回 404 Not Found。express
經過以下命令啓動此應用:npm
node app.js
而後在瀏覽器中打開 http://localhost:3000/ 並查看輸出結果。json
三.中間件
http://www.expressjs.com.cn/guide/using-middleware.html
Express 是一個自身功能極簡,徹底是由路由和中間件構成一個的 web 開發框架:從本質上來講,一個 Express 應用就是在調用各類中間件。
中間件(Middleware) 是一個函數,它能夠訪問請求對象(request object (req
)), 響應對象(response object (res
)), 和 web 應用中處於請求-響應循環流程中的中間件,通常被命名爲 next
的變量。
中間件的功能包括:
若是當前中間件沒有終結請求-響應循環,則必須調用 next()
方法將控制權交給下一個中間件,不然請求就會掛起。
Express 應用可以使用以下幾種中間件:
使用可選則掛載路徑,可在應用級別或路由級別裝載中間件。另外,你還能夠同時裝在一系列中間件函數,從而在一個掛載點上建立一個子中間件棧。
應用級中間件綁定到 app 對象 使用 app.use()
和 app.METHOD()
, 其中, METHOD
是須要處理的 HTTP 請求的方法,例如 GET, PUT, POST 等等,所有小寫。例如:
var app = express(); // 沒有掛載路徑的中間件,應用的每一個請求都會執行該中間件 app.use(function (req, res, next) { console.log('Time:', Date.now()); next(); }); // 掛載至 /user/:id 的中間件,任何指向 /user/:id 的請求都會執行它 app.use('/user/:id', function (req, res, next) { console.log('Request Type:', req.method); next(); }); // 路由和句柄函數(中間件系統),處理指向 /user/:id 的 GET 請求 app.get('/user/:id', function (req, res, next) { res.send('USER'); });
下面這個例子展現了在一個掛載點裝載一組中間件。
// 一箇中間件棧,對任何指向 /user/:id 的 HTTP 請求打印出相關信息 app.use('/user/:id', function(req, res, next) { console.log('Request URL:', req.originalUrl); next(); }, function (req, res, next) { console.log('Request Type:', req.method); next(); });
做爲中間件系統的路由句柄,使得爲路徑定義多個路由成爲可能。在下面的例子中,爲指向 /user/:id
的 GET 請求定義了兩個路由。第二個路由雖然不會帶來任何問題,但卻永遠不會被調用,由於第一個路由已經終止了請求-響應循環。
// 一箇中間件棧,處理指向 /user/:id 的 GET 請求 app.get('/user/:id', function (req, res, next) { console.log('ID:', req.params.id); next(); }, function (req, res, next) { res.send('User Info'); }); // 處理 /user/:id, 打印出用戶 id app.get('/user/:id', function (req, res, next) { res.end(req.params.id); });
若是須要在中間件棧中跳過剩餘中間件,調用 next('route')
方法將控制權交給下一個路由。 注意: next('route')
只對使用 app.VERB()
或 router.VERB()
加載的中間件有效。
// 一箇中間件棧,處理指向 /user/:id 的 GET 請求 app.get('/user/:id', function (req, res, next) { // 若是 user id 爲 0, 跳到下一個路由 if (req.params.id == 0) next('route'); // 不然將控制權交給棧中下一個中間件 else next(); // }, function (req, res, next) { // 渲染常規頁面 res.render('regular'); }); // 處理 /user/:id, 渲染一個特殊頁面 app.get('/user/:id', function (req, res, next) { res.render('special'); });
路由級中間件和應用級中間件同樣,只是它綁定的對象爲 express.Router()
。
var router = express.Router();
路由級使用 router.use()
或 router.VERB()
加載。
上述在應用級建立的中間件系統,可經過以下代碼改寫爲路由級:
var app = express(); var router = express.Router(); // 沒有掛載路徑的中間件,經過該路由的每一個請求都會執行該中間件 router.use(function (req, res, next) { console.log('Time:', Date.now()); next(); }); // 一箇中間件棧,顯示任何指向 /user/:id 的 HTTP 請求的信息 router.use('/user/:id', function(req, res, next) { console.log('Request URL:', req.originalUrl); next(); }, function (req, res, next) { console.log('Request Type:', req.method); next(); }); // 一箇中間件棧,處理指向 /user/:id 的 GET 請求 router.get('/user/:id', function (req, res, next) { // 若是 user id 爲 0, 跳到下一個路由 if (req.params.id == 0) next('route'); // 負責將控制權交給棧中下一個中間件 else next(); // }, function (req, res, next) { // 渲染常規頁面 res.render('regular'); }); // 處理 /user/:id, 渲染一個特殊頁面 router.get('/user/:id', function (req, res, next) { console.log(req.params.id); res.render('special'); }); // 將路由掛載至應用 app.use('/', router);
錯誤處理中間件有 4 個參數,定義錯誤處理中間件時必須使用這 4 個參數。即便不須要 next
對象,也必須在簽名中聲明它,不然中間件會被識別爲一個常規中間件,不能處理錯誤。
錯誤處理中間件和其餘中間件定義相似,只是要使用 4 個參數,而不是 3 個,其簽名以下: (err, req, res, next)
。
app.use(function(err, req, res, next) { console.error(err.stack); res.status(500).send('Something broke!'); });
請參考 錯誤處理 一章瞭解更多關於錯誤處理中間件的內容。
從 4.x 版本開始,, Express 已經再也不依賴 Connect 了。除了 express.static
, Express 之前內置的中間件如今已經所有單獨做爲模塊安裝使用了。請參考 中間件列表。
express.static
是 Express 惟一內置的中間件。它基於 serve-static,負責在 Express 應用中提託管靜態資源。
參數 root
指提供靜態資源的根目錄。
可選的 options
參數擁有以下屬性。
屬性 | 描述 | 類型 | 缺省值 |
---|---|---|---|
dotfiles |
是否對外輸出文件名以點(. )開頭的文件。可選值爲 「allow」、「deny」 和 「ignore」 |
String | 「ignore」 |
etag |
是否啓用 etag 生成 | Boolean | true |
extensions |
設置文件擴展名備份選項 | Array | [] |
index |
發送目錄索引文件,設置爲 false 禁用目錄索引。 |
Mixed | 「index.html」 |
lastModified |
設置 Last-Modified 頭爲文件在操做系統上的最後修改日期。可能值爲 true 或 false 。 |
Boolean | true |
maxAge |
以毫秒或者其字符串格式設置 Cache-Control 頭的 max-age 屬性。 | Number | 0 |
redirect |
當路徑爲目錄時,重定向至 「/」。 | Boolean | true |
setHeaders |
設置 HTTP 頭以提供文件的函數。 | Function |
下面的例子使用了 express.static
中間件,其中的 options
對象通過了精心的設計。
var options = { dotfiles: 'ignore', etag: false, extensions: ['htm', 'html'], index: false, maxAge: '1d', redirect: false, setHeaders: function (res, path, stat) { res.set('x-timestamp', Date.now()); } } app.use(express.static('public', options));
每一個應用可有多個靜態目錄。
app.use(express.static('public')); app.use(express.static('uploads')); app.use(express.static('files'));
更多關於 serve-static
和其參數的信息,請參考 serve-static 文檔。
經過使用第三方中間件從而爲 Express 應用增長更多功能。
安裝所需功能的 node 模塊,並在應用中加載,能夠在應用級加載,也能夠在路由級加載。
下面的例子安裝並加載了一個解析 cookie 的中間件: cookie-parser
$ npm install cookie-parser
var express = require('express'); var app = express(); var cookieParser = require('cookie-parser'); // 加載用於解析 cookie 的中間件 app.use(cookieParser());
請參考 第三方中間件 獲取 Express 中常常用到的第三方中間件列表。