基本語法
下列語法為 express
的起手式,後面會慢慢新增功能。
1 | var express = require('express'); //引用express模組 |
params - 取得指定路徑
透過 :name
這個變數,再配合 req.params
搭配使用,可取得路由的值。
PS:設定為變數的重點為前面加個冒號。
1 | //http://127.0.0.1:3000/user/kanboo |
下列範例為可設多個變數(:name、:data),取得路由的值。
1 | //http://127.0.0.1:3000/user/kanboo/abcd |
query - 取得網址參數
以 http://127.0.0.1:3000/user/kanboo?limit=100&q=張惠妹
這段網址為例,
我要用從?(問號)切開,
前段網址:http://127.0.0.1:3000/user/kanboo
後段網址:limit=100&q=張惠妹
要取得前段
網址的資料可用 params ,
若要取後段
網址的資料就要用 query。
下列示範利用 req.query
取得 後段
網址的參數
1 | //網址:http://127.0.0.1:3000/user/kanboo?limit=100&q=張惠妹 |
Middleware - 中介層
簡單來說,Middleware的功能就有點像卡控機制,
例如:我要進去會員頁面時,Middleware可以幫我先確認是否已登入,再看要不要放行?
範例
當我網址要切換至 http://127.0.0.1:3000/user 頁面時,此時可利用 app.use 先確認是否已登入,再決定是否使用 next()
放行,可讀取到 app.get。
1 | //網址:http://127.0.0.1:3000/user |
Middleware - 404頁面
假設user開到一個錯誤的網址 http://127.0.0.1:3000/alskdjlasdjf
,而根本無此網頁的話,這時會客制一個404頁面回應給user知道無此網頁。
範例
利用 res.status(404)
判斷當無此頁面時,回應 抱歉,你的頁面找不到
的訊息給User知道。
1 | // 網址:http://127.0.0.1:3000/alskdjlasdjf |
Middleware - 錯誤頁面
另一種情形是當user要進入某個頁面時,有可能是程式碼執行有誤,這時我們可以先將畫面切換至一個客制的錯誤頁面,告知User待修復,稍後嘗試。
範例
程式碼執行 cc() 這個Function出錯了,這時利用 app.use
的新參數 err ,接收程式碼的錯誤訊息,並回應User系統有誤待修復。
1 | // 錯誤程式碼的狀況 |
Middleware - 中介function呼叫
假設我們有很多頁面
要進入時,都需要先確認user是否已登入,才能進入頁面的話,
這時我們可以將 確認登入程式碼(isLogin)
包成一個 Function,然後在 app.get
插入 isLogin 進行確認。
範例
下列重點為 isLogin 插入的位置,app.get(‘/‘, isLogin, function (req, res){ 程式碼 })
1 | var isLogin = function (req, res, next) { |
static - 載入靜態檔案
若我們在頁面需要提供「圖片、txt檔…」等檔案,如下列範例需使用到 img圖檔,我們要先利用 express.static
指定我們的目錄起點
在哪,這樣img圖檔的路徑才能使用相對路徑
取得資源。
範例
1 | var express = require('express'); |
示意圖
EJS - 樣板語言
安裝語法1
$ npm install ejs-locals --save
使用方法
- 宣告 樣板語言
- 使用 res.render 讀取哪個ejs檔案,如:res.render(‘index‘)
1 | var express = require('express'); |
示意圖
EJS - 參數導入
除了一般將.ejs檔案渲染成HTML外,有時也會因為條件的不同,要渲染出不一樣的HTML格式,這時就可以透過參數的傳遞,來達成此需求。
範例
下列範例示範 res.render,如何傳送參數
以及ejs接收參數的寫法
1 | app.get('/', function (req, res) { |
1 | <!-- |
EJS - 設定layout
當有很多頁面都有用到共同的元素(如:表頭、表尾…等),這時我們可以將會一直重覆的區塊取出,撰寫在 layout.ejs
,若有其他頁面需要表頭、表尾
的部份,我只要將layout.ejs
include在頁面即可。
範例
layout.ejs
- 將共用的部份撰寫在
layout.ejs
- 新增
<%- body %>
這段語法,代表要放置不同頁面各自的內容。
1 |
|
search.ejs
- 在頁面寫入
<% layout('layout') %>
這段語法,代表載入共用HTML部份。 - 接著開始撰寫HTML內容,而撰寫好的HTML,就會放置在layout.ejs檔案裡的
<%- body %>
位置。
1 | <!-- 共用元素 --> |
body-parser - 取得表單資料(傳統表單)
安裝語法
1 | $ npm install body-parser --save |
範例
- 在search搜尋頁面的
searchText
輸入搜尋文字後,點擊送出
按鈕 - 此時會將表單資料傳送(post)給
/searchList
- 再透過後端
req.body
取得到表單資料,進行後續解析。
1 | <form action="/searchList" method="post" > |
1 | var bodyParser = require('body-parser'); |
接收表單頁面(searchList) 是使用 app.post
在searchList處理完資料後,最後記得將畫面導回搜尋畫面 res.redirect(‘search’);
body-parser - 取得表單資料(AJAX)
若達到頁面不跳轉,就可回應相關訊息,此時就需要透過AJAX的方式,達到此需求。
範例
新增一路由 searchAJAX,用來處理搜尋的相關資料,最後回傳給前端。
1 | var express = require('express'); |
重點在於我們將原本在搜尋頁面的 send按鈕 要Submit的動作取消 e.preventDefault();
,改用 AJAX 方式,將表單的內容資料,利用 post
給 searchAJAX
。
1 | var send = document.querySelector('#send'); |
Router - 進階設定
當我們網站有越來越多頁面的話,不可能把所有網頁的路由判斷在寫app.js裡,這樣會造成程式碼雜亂,導致後續維護不便,所以我們可以將同類型頁面分別包裝在不同js檔裡,並且使用 module(模組) 輸出,可供 app.js 分別載入,以達到程式碼的簡潔易懂。
範例
app.js 分別載入 user模組(個人資料)、cart模組(購物車) ,讓整個app.js變得簡潔易懂。
1 | var express = require('express'); |
以user模組(個人資料)為例,因外部引用此模組,語法設定為 app.use(‘/user‘,user);
所以網址起頭從 http://127.0.0.1:3000//user/ 開始
1 | var express = require('express'); |
express-generator - 應用程式產生器
經過上述種種的介紹,了解express各種的使用方式後,之後我們可以利用 Express應用程式產生器 ,自動幫我們生成一個專案的基本架構,就無須從頭到尾慢慢建構。
安裝語法
1 | $ npm install express-generator -g |
建立語法
建立 express 專案資料
1
$ express -e project
切換至專案目錄,並安裝 NPM 套件
1
2$ cd project
$ npm install運行專案
1
$ npm start
專案初始化
下列為 專案初始化 之程式碼,後面可在依據需求新增其他功能模組,如:express-session
、nodemailer(寄信)
、csurf(阻擋跨站攻擊)
、connect-flash(message暫存器)
、dotenv(環境變數設定)
、firebase-admin(資料庫)
…等
1 | var express = require('express'); |