node.js架構 express

來源:互聯網
上載者:User

標籤: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); };


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.