首頁 > web前端 > js教程 > 主體

Express.JS使用詳解_node.js

WBOY
發布: 2016-05-16 16:41:50
原創
1516 人瀏覽過

安裝了node(下載)之後, 在你的機器上建立一個目錄,開始你的第一個應用程式。

$ mkdir hello-world
登入後複製

在這個目錄中你將定義應用程式「包」,這和任何其他node的包沒有什麼不同。文件目錄中的json文件,明確定義了一個依賴項。你可以用npm指令取得express最新版本,你喜歡這樣做,而不是安裝「3.x」以外的版本,以防止任何未知的驚喜。

{
 
"name": "hello-world",
 
"description": "hello world test app",
 
"version": "0.0.1",
 
"private": true,
 
"dependencies": {
  "express": "3.x"
}
}
登入後複製

現在,您已經有一個包包了。 json檔案在這個目錄你可以使用npm(1)安裝這種依賴關係,在這種情況下只需要輸入:

$ npm install
登入後複製

一旦npm完成,你就會在/node_modules目錄中存有一個你依賴的Express 3.x。您可以用npm ls驗證這一點,就像以下程式碼片段所展示的Express樹和自己的依賴關係。

$ npm ls
hello-world@0.0.1 /private/tmp
└─┬ express@3.0.0beta7
 ├── commander@0.6.1
 ├─┬ connect@2.3.9
 │ ├── bytes@0.1.0
 │ ├── cookie@0.0.4
 │ ├── crc@0.2.0
 │ ├── formidable@1.0.11
 │ └── qs@0.4.2
 ├── cookie@0.0.3
 ├── debug@0.7.0
 ├── fresh@0.1.0
 ├── methods@0.0.1
 ├── mkdirp@0.3.3
 ├── range-parser@0.0.4
 ├─┬ response-send@0.0.1
 │ └── crc@0.2.0
 └─┬ send@0.0.3
  └── mime@1.2.6
登入後複製

現在來創建應用程式本身!創建一個名為app.js或server.js檔案,不論你喜歡哪一個,引入express,然後用express()創建一個新的應用程式:

var express = require('express');
var app = express();
登入後複製

新應用程式實例可以透過app.VERB()開始定義路線,在這種情況下,透過「Hello World」字串回應「GET/」請求。 req和res是提供給您的完全相同的node物件,因此你可能會呼叫res.pipe(),req.on('data', callback) 和其他你會做的與Express無關的事情。

Express增強這些物件為你提供更高層次的介面如res.send(),除此之外為你添加內容長度:

app.get('/hello.txt', function(req, res){
 res.send('Hello World');
});
登入後複製

現在為連線呼叫app.listen()方法綁定和監聽,接受相同的參數作為節點的net.Server #listen():

var server = app.listen(3000, function() {
  console.log('Listening on port %d', server.address().port);
});
登入後複製

使用express(1)來產生應用程式

Express團隊維護便利的專案產生器,命名為express-generator(1)。如果你用npm全域安裝express-generator,那麼你可以從你電腦的任何地方存取到它:

$ npm install -g express-generator
登入後複製

這個工具提供了一種簡單的方法來得到一個應用程式框架,但範圍有限,例如,它只支援幾個模板引擎,而Express自己事實上支持為node建立任何網站框架模板。可透過help查看:

Usage: express [options]
Options:
 -h, --help     output usage information
 -V, --version    output the version number
 -e, --ejs      add ejs engine support (defaults to jade)
 -H, --hogan     add hogan.js engine support
 -c, --css  add stylesheet support (less|stylus|compass) (defaults to plain css)
 -f, --force     force on non-empty directory
登入後複製

如果你想產生一個任何情況都支援的應用程式您只需要簡單地執行::

$ express --css stylus myapp
create : myapp
create : myapp/package.json
create : myapp/app.js
create : myapp/public
create : myapp/public/javascripts
create : myapp/public/images
create : myapp/public/stylesheets
create : myapp/public/stylesheets/style.styl
create : myapp/routes
create : myapp/routes/index.js
create : myapp/views
create : myapp/views/index.jade
create : myapp/views/layout.jade

install dependencies:
$ cd myapp && npm install

run the app:
$ DEBUG=myapp node app

登入後複製

像任何其他node的應用程式,您必須安裝以下的依賴關係:

然後讓我們開始吧。

$ npm start
登入後複製

這是所有你需要讓一個簡單的應用程式啟動並運行。記住,Express不綁定到任何特定的目錄結構,這些只是給你一個指導。應用程式結構的選擇可在github庫中查看 範例 。

錯誤處理

錯誤處理中間件定義就像普通中間件,然而必須定義4個參數數量,這是函數簽名(err, req, res, next):

app.use(function(err, req, res, next){
 console.error(err.stack);
 res.send(500, 'Something broke!');
});
登入後複製

雖然強制的錯誤處理中間件通常不是定義在最後,但在其他app.use()後,其調用如下所示:

var bodyParser = require('body-parser');
var methodOverride = require('method-override');
app.use(bodyParser());
app.use(methodOverride());
app.use(app.router);
app.use(function(err, req, res, next){
 // logic
});
登入後複製

在這些中間件的反應是完全任意的。您可能想要回應一個HTML錯誤頁面,一個簡單的訊息,一個JSON字串,或任何其他你喜歡的回應。

為建立有組織的和更高層次的框架,你可以定義幾個這些錯誤處理中間件,就像你會定義普通中間件。例如假設您想為XHR請求定義一個錯誤處理器,除了這些之外,你可能會做的事如下:

var bodyParser = require('body-parser');
var methodOverride = require('method-override'); 

app.use(bodyParser());
app.use(methodOverride());
app.use(app.router);
app.use(logErrors);
app.use(clientErrorHandler);
app.use(errorHandler);

登入後複製

在更一般的logErrors可以寫請求和錯誤訊息到stderr,loggly,或類似的服務:

function logErrors(err, req, res, next) {
 console.error(err.stack);
 next(err);
}
登入後複製

clientErrorHandler的定義如下所示,,注意,這個錯誤將明確地傳遞到下一個。

function clientErrorHandler(err, req, res, next) {
 if (req.xhr) {
  res.send(500, { error: 'Something blew up!' });
 } else {
  next(err);
 }
}
登入後複製

以下errorHandler「全方位」實作可以定義為:

function errorHandler(err, req, res, next) {
 res.status(500);
 res.render('error', { error: err });
}
登入後複製

使用者線上計數

本節詳細完整講解一個(小)應用程式,使用Redis追蹤使用者線上數量。首先創建一個包。 json檔案包含兩個附件,一個用於redis客戶端,另一個用於Express自己。也確保你已包裝了redis並且透過$redis-server運行。

{
 "name": "app",
 "version": "0.0.1",
 "dependencies": {
  "express": "3.x",
  "redis": "*"
 }
}
登入後複製

接下來,你需要建立一個應用程式,和一個到redis的連接:

var express = require('express');
var redis = require('redis');
var db = redis.createClient();
var app = express();
登入後複製

接下來的中間件追蹤線上用戶。在這裡我們將使用排序集,這樣我們透過可以redis查詢線上用戶,只需要N毫秒。我們透過時間戳作為成員的「線上標準」。注意, 這裡我們使用user-agent字串代替通常的用戶id。

app.use(function(req, res, next){
 var ua = req.headers['user-agent'];
 db.zadd('online', Date.now(), ua, next);
});
登入後複製

下一個中間件是在最後一刻使用zrevrangebyscore來獲取最大在線用戶數量,我們總是得到最近在線的用戶,他的上限是當前時間戳減去60000毫秒。

app.use(function(req, res, next){
 var min = 60 * 1000;
 var ago = Date.now() - min;
 db.zrevrangebyscore('online', '+inf', ago, function(err, users){
  if (err) return next(err);
  req.online = users;
  next();
 });
});
登入後複製

最后,我们通过一个url使用它,并绑定到一个端口!这就完了,在一个新浏览器访问这个应用程序,您会看到在线人数增加。

app.get('/', function(req, res){
 res.send(req.online.length + ' users online');
});

app.listen(3000);

登入後複製

Expree的反向代理

在反向代理背后使用Expree,如Varnish 或Nginx是微不足道的,然而它需要配置。通过启用“信任代理”设置app.enable(“trust proxy”),Express有一些反向代理的技巧,X-Forwarded - *头字段可能是可信的,否则他们可能很容易被欺骗。

启用该设置有一些微妙的影响。第一个是X-Forwarded-Proto可能被反向代理设定,告诉app那是https或者只是简单的http。这个值由req.protocol反射。

第二个变化是req.ip和req.ips值将填充X-Forwarded-For地址的列表。

调试Express

Express内部使用调试模块记录路径匹配和应用程序模式的信息。要看到这条信息,只要简单设置调试环境变量为express:*,当启动应用程序后,你将在控制台看以调试信息。

$ DEBUG=express:* node ./bin/www
登入後複製

运行这个hello world示例将打印以下内容:

express:application booting in development mode +0ms
express:router defined get /hello.txt +0ms
express:router defined get /hello.txt +1ms
登入後複製

另外, 表达可执行(生成器)生成的程序也使用调试模块,默认作用域是my-application调试命名空间。

你可以用以下命令启用这些调试语句

$ DEBUG=my-application node ./bin/www
登入後複製

关于调试的更多信息,请参见调试 指南

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!