啜嗳1 middlewares,route,view,requestとreponseの対象
8995 ワード
ExpressはNODEJS httpモジュールに基づくネットワークサービスの枠組みであり、以下のいくつかの特徴がある..JavaScriptを開発言語として使用し、フロントエンドバックエンド言語の一致を実現する. 最大の特徴:中間部品とルーティング フレキシブルで、モジュール化の理念を採用するので、必要に応じてサービスを組み立てることができます.
expressの基本概念は、express公式サイトを参照することができます.下は自分で勉強したノートです.
一.第三者のmiddlewareライブラリ
mogan:LOGGING MIDDLEWARE
これはログの使用に用いられ、ユーザ操作を記録するために使用され、サービス端末応答要求requestsは時間がかかり、性能分析として使用される.
インストール:
これはexpress自身のパッケージの中間部品ですので、npmからインストールする必要はありません.このミドルウェアは、イメージ、CSS、HTMLファイルなどの静的リソースを送信するために使用されます.
アプリケーションの静的リソースが
一つの価値があるのは、開発中には、
その他
とりあえずこれらの中間部品に接触して、他の中間部品は列挙するだけで、後で会ったら詳しく話します. を阻止する. . 二.Routing
ルートは、URLと特定のHTTP methodに基づいて、要求を特定の処理関数にマッチングさせる.
たとえば:
ルートのパスマッチングには3つの方法があります.文字列 文字列モード:正規表現と文字列の組み合わせの書き方です. 正規表現 1.最も一般的な文字列:
この2つのオブジェクトはExpressで拡張されています.NODEJSには属性がないものがあります.以下には、Expressの2つのオブジェクトに対する拡張属性をいくつか並べます.
redirect([status,]path)
reponseオブジェクトにリダイレクト方法が追加され、状態コードはデフォルトで
Express v 4.8.0バージョン以上はこの方法をサポートします.
指定されたパスのファイルを送信するには、
optionsの具体的なオプションは、ドキュメントのsendFile()を参照してください.
viewをレンダリングして、クライアントにレンダリングしたhtml文字列を送信します.パラメータ: locars:viewのローカル変数 を定義するオブジェクト. calback:可能なエラーとレンダリングされた文字列を返します.エラーが発生した場合、メソッド内部でnextを呼び出します. view:ファイルパス文字列.絶対パスまたは相対的なview設定の相対パスとすることができる.パスにファイル拡張が含まれていない場合は、 が決定される.
local variable cacheはviewをキャッシュします.trueに設定すると、開発時にキャッシュされます.製品の段階に対して、view cachingはデフォルトでtrueです.
新規要求の方法は、特定のHTTP request headerフィールドに戻る(大文字と小文字を区別しない).
要求されたipアドレスを返します.
expressのビューは、EJS(Embodd JavaScript)、Pug、Handlebarsなどの様々なモデルを使用してレンダリングすることができます.
ビューを設定します.
以下は伝言本の小さいページです.
締め括りをつける
この章は主にExpressの具体的な操作と一部のAPIの紹介です.Expressの2つの特徴を簡単に話しました.middleware、route.また、ビューも使用して、どのようにモデルエンジンを介してレンダリングされます.
expressの基本概念は、express公式サイトを参照することができます.下は自分で勉強したノートです.
一.第三者のmiddlewareライブラリ
mogan:LOGGING MIDDLEWARE
これはログの使用に用いられ、ユーザ操作を記録するために使用され、サービス端末応答要求requestsは時間がかかり、性能分析として使用される.
インストール:
npm install --save morgan
使用:var express = require('express');
var http = require('http');
// Morgan
var logger = require('morgan');
var app = express();
// morgan ,
// , app.use(logger('dev'));
app.use(logger('short'));
app.use(function(req, res) {
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end('hello express');
});
http.createServer(app).listen(3000);
// localhost:3000
// console
::1 - GET / HTTP/1.1 200 - - 0.621 ms
express.staticこれはexpress自身のパッケージの中間部品ですので、npmからインストールする必要はありません.このミドルウェアは、イメージ、CSS、HTMLファイルなどの静的リソースを送信するために使用されます.
アプリケーションの静的リソースが
public
ディレクトリの下に保存されている場合、この中間ウェアを介してファイルを送信することができる.var path = require('path');
// NODE path public
var publicPath = path.resolve(__dirname, 'public');
// 'public'
app.use(express.static(publicPath));
app.use(function(req, res) {
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end(' ');
});
// ...
ファイルが見つからない場合は、appは次の中間部品に進みます.見つかったら、express.staticはこのファイルを送ります.中間部品のチェーン操作を停止します.一つの価値があるのは、開発中には、
res.sendFile()
を使用して静的なファイルを提供することができるが、この関数は、ファイル要求毎にファイルシステムの読み取りを要求する必要があり、アプリケーションの全体的な性能に影響を与えるため、生産環境では実行しないことである.serve-static
ミドルウェアを使用することを提案します.このミドルウェアは最適化され、Expressアプリケーションのためのファイルを提供するために使用されます.もう一つのより良いオプションは、静的なファイルを逆代理で提供することです.その他
とりあえずこれらの中間部品に接触して、他の中間部品は列挙するだけで、後で会ったら詳しく話します.
body-parser
:HTTP request bodyを解析するconnect-ratelimit
:毎時の接続数を制限し、もし誰かがサーバに大量の要求を送信するなら、この中間部品を利用してエラーを返し、サーバのあたまhelmet
:特定のタイプの攻撃を阻止するためにHTTP headersをアプリケーションに追加するcookie-parser
:解析ブラウザクッキーresponse-time
:X-Leesponse-Time headerを送信して、app性能を調整するためのルートは、URLと特定のHTTP methodに基づいて、要求を特定の処理関数にマッチングさせる.
たとえば:
var express = require('express');
var http = require('http');
var path = require('path');
var app = express()
var publicPath = path.resolve(__dirname, 'public');
app.use(express.static(publicPath));
// '/'
// HTTP GET
app.get('/', function(req, res) {
res.end(' ');
});
// '/about/:name'
app.get('/about/:name', function(req, res) {
res.end(`${req.params.name} About `)
});
// , 404
//
app.use(function(req, res) {
// 404
res.statusCode = 404;
res.end(' ')
});
http.createServer(app).listen('3000');
app.get()を使用できるほか、app.post()など他のhttp動作を使用することもできます.ルートのパスマッチングには3つの方法があります.
app.get('/home', ...)
app.get('/about/company', ...)
app.get('/user/:id', ...) // /user/1, /user/2, ....
2.文字列モードapp.get('/ab?cd', ...) // acd, abcd
app.get('/ab+cd', ...) // abcd, abbcd, abbb...cd
app.get('/ab(cd)?e',...) // abe, abcde
3.正規表現app.get(/a/, ...) // 'a'
app.get(/.*fly$/, ...) // 'fly'
三.request対象とレスポンス対象この2つのオブジェクトはExpressで拡張されています.NODEJSには属性がないものがあります.以下には、Expressの2つのオブジェクトに対する拡張属性をいくつか並べます.
redirect([status,]path)
reponseオブジェクトにリダイレクト方法が追加され、状態コードはデフォルトで
302
であり、以下のいくつかの形態がある.res.redirect('/foo/bar')
res.redirect('http://example.com')
res.redirect(301, 'http://example.com')
res.redirect('..')
res.redirect('back')
# 1. URL
res.redirect('http://google.com');
# 2. host , ' http://example.com/admin/post/new'
// 'http://example.com/admin'
res.redirect('/admin')
# 3. , 'http://example.com/blog/admin/'( '/')
// ' http://example.com/blog/admin/post/new'
res.redirect('post/new');
// 'http://example.com/blog/admin'( '/')
// ' http://example.com/blog/post/new'
# 4. , 'http://example.com/admin/post/new'
// ' http//example.com/admin/post'
res.redirect('..')
# 5.'back' referer; referer , '/'
res.redirect('back')
res.sendFile(path[,options][,fn]Express v 4.8.0バージョン以上はこの方法をサポートします.
指定されたパスのファイルを送信するには、
path
は絶対パスである必要があります.Content-Type
は、ファイルの拡張設定に従う.optionsの具体的なオプションは、ドキュメントのsendFile()を参照してください.
fn
は、request-reponse cycleを終了するか、または制御を次のrouteに渡す必要がある.app.get('/file/:name', function(req, res, next) {
var options = {
root: __dirname + '/public',
dotfiles: 'deny',
headers: {
'x-timestamp': Date.now(),
'x-send': true
}
};
var fileName = req.params.name;
res.sendFile(fileName, options, function(err) {
if (err) {
next(err);
} else {
console.log('Send: ' + fileName);
}
});
});
レスポンスを設定するHTTP statusは、リターン値をチェーン式で呼び出すことができます.res.status(403).end()
res.status(400).send('BAD REQUEST')
res.status(404).sendFile('/absolute/path/to/404.html')
res.render(view[,local back])viewをレンダリングして、クライアントにレンダリングしたhtml文字列を送信します.パラメータ:
view engine
の設定に従ってファイル拡張local variable cacheはviewをキャッシュします.trueに設定すると、開発時にキャッシュされます.製品の段階に対して、view cachingはデフォルトでtrueです.
// view
res.render('index')
// , html
res.render('index', function(err, html) {
res.send(html);
});
// local view
res.render('user', { name: 'Tobi' }, function(err, html) {
// ...
})
req.get(field)新規要求の方法は、特定のHTTP request headerフィールドに戻る(大文字と小文字を区別しない).
req.get('Content-Type') // 'text/plain'
req.get('something') // undefined
req.ip要求されたipアドレスを返します.
var EVIL_IP = '123.45.67.89';
app.use(function(req, res, next) {
if (req.ip === EVIL_IP) {
res.status(401).send(' ip ');
} else {
next();
}
});
// ...
四.Viewsexpressのビューは、EJS(Embodd JavaScript)、Pug、Handlebarsなどの様々なモデルを使用してレンダリングすることができます.
ビューを設定します.
// views
app.set('views', path.resolve(__dirname, "views"))
//
// npm install --save ejs
app.set('view engine', 'ejs')
五.例以下は伝言本の小さいページです.
// app.js
var express = require('express');
var http = require('http');
var path = require('path');
var logger = require('morgan');
var bodyParser = require('body-parser');
var app = express();
//
app.set('views', path.resolve(__dirname, 'views'));
app.set('view engine', 'ejs');
var entries = [];
app.locals.entries = entries; // entries views
app.use(logger('dev'));
// 。 req.body
// extended
app.use(bodyParser.urlencoded({ extended: false }));
// , views/index.ejs
app.get('/', function(req, res) {
res.render('index');
});
app.get('/new-entry', function(req, res) {
res.render('new-entry');
});
// '/new-entry' POST
app.post('/new-entry', function(req, res) {
// title body, 400
if (!req.body.title || !req.body.body) {
res.status(400).send('Entries must have a title and body');
return;
}
entries.push({
title: req.body.title,
content: req.body.body,
published: new Date()
});
// entry
res.redirect('/');
});
// 404 page
app.use(function(req, res) {
res.status(400).render('404');
});
http.createServer(app).listen('8888');
具体的なコードはexpress-gust book githubです.締め括りをつける
この章は主にExpressの具体的な操作と一部のAPIの紹介です.Expressの2つの特徴を簡単に話しました.middleware、route.また、ビューも使用して、どのようにモデルエンジンを介してレンダリングされます.