Express
要約内容は、この冬休みに自宅で勉強するためのPPTからのものです
1.Expressフレームワークの紹介と最初の経験
1.1Expressフレームワークとは
Expressは、ノードプラットフォームに基づくWebアプリケーション開発フレームワークであり、さまざまなWebアプリケーションの作成に役立つ一連の強力な機能を提供します。npm installexpressコマンドを使用してダウンロードできます。
1.2Expressフレームワークの機能
- 便利で簡潔なルート定義方法を提供します
- HTTPリクエストパラメータを取得するための簡略化された処理
- テンプレートエンジンの高度なサポート、ダイナミックHTMLページのレンダリングが簡単
- HTTPリクエストを効果的に制御するミドルウェアメカニズムを提供します
- 機能を拡張するために多数のサードパーティミドルウェアを用意する
1.3ネイティブNode.jsとExpressフレームワーク間のルーティングの比較
app.on('request', (req, res) => {
// 获取客户端的请求路径
let {
pathname } = url.parse(req.url);
// 对请求路径进行判断 不同的路径地址响应不同的内容
if (pathname == '/' || pathname == 'index') {
res.end('欢迎来到首页');
} else if (pathname == '/list') {
res.end('欢迎来到列表页页');
} else if (pathname == '/about') {
res.end('欢迎来到关于我们页面')
} else {
res.end('抱歉, 您访问的页面出游了');
}
});
// 当客户端以get方式访问/时
app.get('/', (req, res) => {
// 对客户端做出响应
res.send('Hello Express');
});
// 当客户端以post方式访问/add路由时
app.post('/add', (req, res) => {
res.send('使用post方式请求了/add路由');
});
1.4リクエストパラメータを取得するためのネイティブNode.jsとExpressフレームワークの比較
app.on('request', (req, res) => {
// 获取GET参数
let {
query} = url.parse(req.url, true);
// 获取POST参数
let postData = '';
req.on('data', (chunk) => {
postData += chunk;
});
req.on('end', () => {
console.log(querystring.parse(postData)
}));
});
app.get('/', (req, res) => {
// 获取GET参数
console.log(req.query);
});
app.post('/', (req, res) => {
// 获取POST参数
console.log(req.body);
})
1.5Expressの最初の経験
Expressフレームワークを使用してWebサーバーを作成するのは非常に簡単で、Expressモジュールによって返される関数を呼び出すだけです。
// 引入Express框架
const express = require('express');
// 使用框架创建web服务器
const app = express();
// 当客户端以get方式访问/路由时
app.get('/', (req, res) => {
// 对客户端做出响应 send方法会根据内容的类型自动设置请求头
res.send('Hello Express'); // <h2>Hello Express</h2> {say: 'hello'}
});
// 程序监听3000端口
app.listen(3000);
2.ミドルウェア
2.1ミドルウェアとは
ミドルウェアは一連のメソッドであり、クライアントからの要求の受信、要求への応答、または処理のために次のミドルウェアに要求を渡すことができます。
ミドルウェアは、主にミドルウェア方式とリクエスト処理機能の2つの部分で構成されています。
ミドルウェアメソッドは、リクエストのインターセプトを担当するExpressによって提供され、リクエスト処理機能は、リクエストの処理を担当する開発者によって提供されます。
app.get('请求路径', '处理函数') // 接收并处理get请求
app.post('请求路径', '处理函数') // 接收并处理post请求
同じリクエストに対して複数のミドルウェアを設定し、同じリクエストを複数回処理することができます。
デフォルトでは、リクエストは上から下の順にミドルウェアと照合されます。照合が成功すると、照合は終了します。
nextメソッドを呼び出して、要求を終了するミドルウェアが検出されるまで、要求の制御を次のミドルウェアに移すことができます。
app.get('/request', (req, res, next) => {
req.name = "张三";
next();
});
app.get('/request', (req, res) => {
res.send(req.name);
});
2.2app.useミドルウェアの使用法
app.useはすべてのリクエストメソッドに一致し、リクエスト処理関数で直接渡すことができます。つまり、すべてのリクエストが受信されます。
app.use((req, res, next) => {
console.log(req.url);
next();
});
app.useの最初のパラメーターをリクエストアドレスに渡すこともできます。つまり、リクエストの方法が何であっても、リクエストがリクエストアドレスである限り、リクエストは受信されます。
app.use('/admin', (req, res, next) => {
console.log(req.url);
next();
});
2.3ミドルウェアアプリケーション
- ルート保護。クライアントがログインする必要のあるページにアクセスすると、最初にミドルウェアを使用してユーザーのログインステータスを判断できます。ユーザーがログインしていない場合、クライアントはリクエストを傍受し、直接応答してユーザーのログインを禁止します。ログインする必要のあるページに入る。
- Webサイトのメンテナンスアナウンスは、すべてのルートの最上位ですべての要求を受信し、クライアントに直接応答するミドルウェアを定義します。Webサイトはメンテナンス中です。
- カスタム404ページ
2.4ミドルウェアの処理エラー
プログラム実行の過程で、ファイルの読み取りの失敗やデータベース接続の失敗など、予期しないエラーが必然的に発生します。
エラー処理ミドルウェアは、エラーが一元的に処理される場所です。
app.use((err, req, res, next) => {
res.status(500).send('服务器发生未知错误');
})
プログラムでエラーが発生した場合は、next()メソッドを呼び出し、エラー情報をパラメーターの形式でnext()メソッドに渡して、エラー処理ミドルウェアをトリガーします。
app.get("/", (req, res, next) => {
fs.readFile("/file-does-not-exist", (err, data) => {
if (err) {
next(err);
}
});
});
2.5キャッチエラー
node.jsでは、非同期APIのエラー情報はコールバック関数を介して取得され、Promiseオブジェクトをサポートする非同期APIはcatchメソッドでキャッチできます。
非同期関数の実行でエラーが発生した場合、エラーをキャッチするにはどうすればよいですか?
try catchは、非同期関数や他の同期コードの実行中に発生するエラーをキャッチできますが、他のタイプのAPIで発生するエラーはキャッチできません。
app.get("/", async (req, res, next) => {
try {
await User.find({
name: '张三'})
}catch(ex) {
next(ex);
}
});
3.エクスプレスリクエスト処理
3.1モジュラールーティングの構築
const express = require('express')
// 创建路由对象
const home = express.Router();
// 将路由和请求路径进行匹配
app.use('/home', home);
// 在home路由下继续创建路由
home.get('/index', () => {
// /home/index
res.send('欢迎来到博客展示页面');
});
または:
// home.js
const home = express.Router();
home.get('/index', () => {
res.send('欢迎来到博客展示页面');
});
module.exports = home;
// admin.js
const admin = express.Router();
admin.get('/index', () => {
res.send('欢迎来到博客管理页面');
});
module.exports = admin;
// app.js
const home = require('./route/home.js');
const admin = require('./route/admin.js');
app.use('/home', home);
app.use('/admin', admin);
3.3GETパラメータの取得
Expressフレームワークでは、req.queryを使用してGETパラメーターを取得できます。フレームワークは、GETパラメーターをオブジェクトに変換して返します。
// 接收地址栏中问号后面的参数
// 例如: http://localhost:3000/?name=zhangsan&age=30
app.get('/', (req, res) => {
console.log(req.query); // {"name": "zhangsan", "age": "30"}
});
3.4POSTパラメーターの取得
ExpressでPOSTリクエストパラメータを受信するには、サードパーティのパッケージbody-parserを使用する必要があります。
// 引入body-parser模块
const bodyParser = require('body-parser');
// 配置body-parser模块
app.use(bodyParser.urlencoded({
extended: false }));
// 接收请求
app.post('/add', (req, res) => {
// 接收请求参数
console.log(req.body);
})
3.5Expressルーティングパラメータ
app.get('/find/:id', (req, res) => {
console.log(req.params); // {id: 123}
});
localhost:3000 / find / 123
3.6静的リソースの処理
img、CSS、JavaScriptファイルなどの静的ファイルは、Expressに組み込まれているexpress.staticによって便利にホストできます。
app.use(express.static('public'));
これで、パブリックディレクトリの下のファイルにアクセスできます。
- http:// localhost:3000 / images / kitten.jpg
- http:// localhost:3000 / css / style.css
- http:// localhost:3000 / js / app.js
- http:// localhost:3000 / images / bg.png
- http:// localhost:3000 / hello.html
4.express-art-templateテンプレートエンジン
4.1テンプレートエンジン
アートテンプレートテンプレートエンジンがExpressフレームワークとより適切に連携できるようにするために、テンプレートエンジンは、元のアートテンプレートテンプレートエンジンに基づいて、エクスプレスアートテンプレートを公式にカプセル化します。
npm install art-templateexpress-art-templateコマンドを使用してインストールします。
// 当渲染后缀为art的模板时 使用express-art-template
app.engine('art', require('express-art-template'));
// 设置模板存放目录
app.set('views', path.join(__dirname, 'views'));
// 渲染模板时不写后缀 默认拼接art后缀
app.set('view engine', 'art');
app.get('/', (req, res) => {
// 渲染模板
res.render('index');
});
4.2app.localsオブジェクト
app.localsオブジェクトの下に変数を設定します。このデータは、すべてのテンプレートで取得できます。
app.locals.users = [{
name: '张三',
age: 20
},{
name: '李四',
age: 20
}]