標籤:style http color java 使用 io strong 檔案
express是在node.js的基礎上,拓展出的一個簡潔實用的架構結構,運用這個東西,我們可以更方便的處理很多的事情。只要上手了,那就是個貝多芬!
一般安裝express有幾種方法。
第一,使用npm安裝,cmd中輸入npm install express -g,這個-g是全域安裝,也就是安裝在被你用"config set global"設定的檔案夾裡,需要注意的是,安裝完了以後,需要改變環境變數以及其路徑來指向你的安裝目錄。
第二,複製粘貼。(……廢話!)不過這樣的存在安全性問題,因為在複製粘貼的過程中,可能會有資料丟失之類的情況出現。
最後,值得注意的是,一旦在你的nodejs中存在了一個檔案夾裡面放置了express架構,而且他被你引用過,那麼無論你怎麼挽救也是無用的……要麼把它刪除,要麼把它覆蓋。
express()
建立一個express應用程式
相當於new一個對象,但是還能少寫三個字母,將express存入變數app中,從此app翻身做主人!
| 1 2 3 4 5 6 7 |
var express = require( ‘express‘ ); var app = express(); app.get( ‘/‘ , function (req, res){ res.send( ‘hello world‘ ); }); app.listen(3000); |
app.set(name, value)
將設定項 name 的值設為 value
這個方法主要運用於設定連接埠,或者設定檔案夾存放,其他用途似乎比較少見
| 1 2 |
app.set( ‘title‘ , ‘My Site‘ ); app.get( ‘title‘ ); // => "My Site" |
app.get(name)
擷取設定項 name 的值
| 1 2 |
app.get( ‘title‘ ); // => undefinedapp.set(‘title‘, ‘My Site‘); app.get( ‘title‘ ); // => "My Site" |
app.enable(name)
將設定項 name 的值設為 true.
| 1 2 |
app.enable( ‘trust proxy‘ ); app.get( ‘trust proxy‘ ); // => true |
app.disable(name)
將設定項 name 的值設為 false.
| 1 2 |
app.disable( ‘trust proxy‘ ); app.get( ‘trust proxy‘ ); // => false |
app.enabled(name)
檢查設定項 name 是否已啟用
| 1 2 |
app.enabled( ‘trust proxy‘ ); // => falseapp.enable(‘trust proxy‘); app.enabled( ‘trust proxy‘ ); // => true |
app.disabled(name)
檢查設定項 name 是否已禁用
| 1 2 |
app.disabled( ‘trust proxy‘ ); // => trueapp.enable(‘trust proxy‘) app.disabled( ‘trust proxy‘ ); // => false |
app.use([path], function)
這裡有一個實際應用情境,常見的一個應用是使用./public提供靜態檔案服務,用 express.static() 中介軟體:
這裡path是使用了預設的"/",express.static()儲存了資源存放的檔案名稱,__dirname是規定的全域變數,表示開發期間,該行代碼所在的目錄(其實就是相當於當前檔案夾)
| 1 2 3 4 |
// GET /javascripts/jquery.js // GET /style.css // GET /favicon.ico app.use(express. static (__dirname + ‘/public‘ )); |
如果你想把所有的靜態檔案路徑都首碼"/static", 你可以使用“掛載”功能。如果req.url 不包含這個首碼, 掛載過的中介軟體不會執行。當function被執行的時候,這個參數不會被傳遞。這個只會影響這個函數,後面的中介軟體裡得到的 req.url裡將會包含"/static"
| 1 2 3 4 |
// GET /static/javascripts/jquery.js // GET /static/style.css // GET /static/favicon.ico app.use( ‘/static‘ , express. static (__dirname + ‘/public‘ )); |
使用 app.use() “定義的”中介軟體的順序非常重要,它們將會順序執行,use的先後順序決定了中介軟體的優先順序。比如說通常 express.logger() 是最先使用的一個組件,紀錄每一個請求
| 1 2 3 4 5 |
app.use(express.logger()); app.use(express. static (__dirname + ‘/public‘ )); app.use( function (req, res){ res.send( ‘Hello‘ ); }); |
如果你想忽略請求靜態檔案的紀錄,但是對於在 logger()之後定義的路由和中介軟體想繼續紀錄,只需要簡單的把static() 移到前面就行了:
| 1 2 3 4 5 |
app.use(express. static (__dirname + ‘/public‘ )); app.use(express.logger()); app.use( function (req, res){ res.send( ‘Hello‘ ); }); |
另一個現實的例子,有可能從多個目錄提供靜態檔案服務,下面的例子中會優先從"./public"目錄取檔案
| 1 2 3 |
app.use(express. static (__dirname + ‘/public‘ )); app.use(express. static (__dirname + ‘/files‘ )); app.use(express. static (__dirname + ‘/uploads‘ )); |
app.engine(ext, callback)
註冊模板引擎的 callback 用來處理ext副檔名的檔案預設情況下, 根據副檔名require() 對應的模板引擎。比如你想渲染一個 "foo.jade" 檔案,Express會在內部執行下面的代碼,然後會緩衝require(),這樣就可以提高後面操作的效能
| 1 |
app.engine( ‘jade‘ , require( ‘jade‘ ).__express); |
那些沒有提供 .__express 的或者你想渲染一個檔案的副檔名與模板引擎預設的不一致的時候,也可以用這個方法。比如你想用EJS模板引擎來處理 ".html" 尾碼的檔案:
| 1 |
app.engine( ‘html‘ , require( ‘ejs‘ ).renderFile); |
這個例子中EJS提供了一個.renderFile() 方法和Express預期的格式: (path, options, callback)一致, 可以在內部給這個方法取一個別名ejs.__express,這樣你就可以使用".ejs" 擴充而不需要做任何改動
有些模板引擎沒有遵循這種轉換, 這裡有一個小項目consolidate.js 專門把所有的node流行的模板引擎進行了封裝,這樣它們在Express內部看起來就一樣了。
| 1 2 3 |
var engines = require( ‘consolidate‘ ); app.engine( ‘haml‘ , engines.haml); app.engine( ‘html‘ , engines.hogan); |
app.param([name], callback)
路由參數的處理邏輯。比如當 :user 出現在一個路由路徑中,你也許會自動載入載入使用者的邏輯,並把它放置到 req.user , 或者校正一下輸入的參數是否正確。
下面的程式碼片段展示了callback很像中介軟體,但是在參數裡多加了一個值,這裡名為id.它會嘗試載入使用者資訊,然後賦值給req.user, 否則就傳遞錯誤next(err).
| 1 2 3 4 5 6 7 8 9 10 11 12 |
app.param( ‘user‘ , function (req, res, next, id){ User.find(id, function (err, user){ if (err) { next(err); } else if (user) { req.user = user; next(); } else { next( new Error( ‘failed to load user‘ )); } }); }); |
另外你也可以只傳一個callback, 這樣你就有機會改變 app.param() API.比如express-params定義了下面的回調,這個允許你使用一個給定的正則去限制參數。
下面的這個例子有一點點進階,檢查如果第二個參數是一個正則,返回一個很像上面的"user"參數例子行為的回呼函數。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 |
app.param( function (name, fn){ if (fn instanceof RegExp) { return function (req, res, next, val){ var captures; if (captures = fn.exec(String(val))) { req.params[name] = captures; next(); } else { next( ‘route‘ ); } } } }); |
這個函數現在可以非常有效用來校正參數,或者提供正則捕獲後的分組。
app.listen()
在給定的主機和連接埠上監聽請求,這個和node的文檔http.Server#listen()是一致的
| 1 2 |
var express = require( ‘express‘ ); var app = express(); app.listen(3000); |
express()返回的app實際上是一個JavaScriptFunction,它被設計為傳給node的http servers作為處理請求的回呼函數。因為app不是從HTTP或者HTTPS繼承來的,它只是一個簡單的回呼函數,你可以以同一份代碼同時處理HTTP and HTTPS 版本的服務。
| 1 2 3 4 5 |
var express = require( ‘express‘ ); var https = require( ‘https‘ ); var http = require( ‘http‘ ); var app = express();http.createServer(app).listen(80); https.createServer(options, app).listen(443); |
app.listen() 方法只是一個快捷方法,如果你想使用HTTPS,或者同時提供HTTP和HTTPS,可以使用上面的代碼
| 1 2 3 4 |
app.listen = function (){ var server = http.createServer( this ); return server.listen.apply(server, arguments); }; |