Express.JSの詳しい使い方_node.js

WBOY
WBOYオリジナル
2016-05-16 16:41:501584ブラウズ

ノードをインストール (ダウンロード) した後、マシン上にディレクトリを作成し、最初のアプリケーションを起動します。

$ mkdir hello-world

このディレクトリでは、他のノード パッケージと何ら変わらないアプリケーションの「パッケージ」を定義します。ファイル ディレクトリ内の json ファイルは、依存関係を明確に定義します。予期せぬ事態を避けるために、「3.x」以外のバージョンをインストールするのではなく、npm コマンドを使用して、任意の最新バージョンの Express を入手できます。

{
 
"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 の依存関係が作成されます。次のスニペットは Express ツリーとその依存関係を示しているため、npm ls を使用してこれを確認できます。

$ 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 は提供されるノード オブジェクトとまったく同じであるため、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 自体はノード用の Web サイト フレームワーク テンプレートの構築を実際にサポートしているのに対し、少数のテンプレート エンジンのみをサポートしています。ヘルプから表示できます:

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

他のノード アプリケーションと同様に、次の依存関係をインストールする必要があります:

それでは始めましょう。

$ npm start
シンプルなアプリを起動して実行するために必要なのはこれだけです。 Express は特定のディレクトリ構造に関連付けられていないことに注意してください。これらはガイドを提供するだけです。アプリケーション構造の選択肢は、github リポジトリの例で確認できます。

エラー処理

エラー処理ミドルウェアは通常のミドルウェアと同じように定義されますが、これは関数シグネチャ (err、req、res、next) の 4 つのパラメーターの数を定義する必要があります。

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 ファイルには 2 つの添付ファイルが含まれており、1 つは Redis クライアント用、もう 1 つは 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 ミリ秒しかかかりません。当社では、メンバー向けの「オンライン標準」としてタイムスタンプを使用しています。ここでは、通常のユーザー ID の代わりにユーザー エージェント文字列を使用していることに注意してください。

app.use(function(req, res, next){
 var ua = req.headers['user-agent'];
 db.zadd('online', Date.now(), ua, next);
});
次のミドルウェアは、zrevrangebyscore を使用して、最後の瞬間のオンライン ユーザーの最大数を取得することです。常に最新のオンライン ユーザーを取得します。その上限は、現在のタイムスタンプから 60000 ミリ秒を引いたものです。

最后,我们通过一个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

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。