Express Express 是一個輕量化且具彈性的 Node.js 網站 (web applications) 開發框架,對無論是網頁或行動應用程式,其都有充足的工具可以支援。
使用 npm 安裝 Express 到專案中:
$ npm install express --save
接著,在專案中開啟一個 app.js ,並創建一個 Express 應用程式,此為使用 Express 的起手式。
1 2 var express = require ('express' );var app = express();
※ 遷移到新版,Express 3 與 Express 4 之間的差異?
以下介紹 Express 常用的 API 功能,和如何使用的範例碼。
express()
1 2 app.use(express.json());
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 var news = require ("./routes/news" );app.use("/news" , news); var express = require ("express" );var router = express.Router();router.get("/breaking" , function (req, res ) { res.send("<h2>Latest news you should know.</h2>" ); }); router.get("/international" , function (req, res ) { res.send("<h2>What's new around the world?</h2>" ); }); module .exports = router;
1 2 3 app.use(express.static("public" ));
1 2 app.use(express.urlencoded({extended : false }));
Application
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 var engine = require ("ejs-locals" );app.engine("ejs" , engine); app.set("views" , "./views" ); app.set("view engine" , "ejs" ); app.get("/product" , function (req, res ) { res.render("product" ) }) app.get("/index" , function (req, res ) { res.render("index" , { name: "Tina" , age: 31 , gender: "female" , family: "<em>Chen</em>" isQualified: true , interest:["hands" , "jogging" , "shopping" ] }) })
1 2 3 4 5 6 7 8 9 10 11 12 13 14 <!-- EJS 使用 express 傳入的物件 --> <ul> <li><%= name %></li> <li><%= age %></li> <li><%- family %></li> <li><% if (isQualified) { %> <em>Displayed!</em> <% } %></li> </ul> <ul> <% for (const index in interests) { %> <li><%- interests[index] %></li> <% } %> </ul>
1 2 3 app.get('/' , function (req, res ) { res.send('GET request to homepage success!' ); })
app.listen(port)
綁定並監聽指定連接埠的連線狀況,與 Node 的 http.server.listen() 方法類似。
※ 在一些主機服務上,如:Heroku, Nodejitsu, AWS,供應商可能會另行設置其他連接埠給你的網站使用,如果寫死埠號可能會造成 500 錯誤,以下有參考的解決方法。
1 2 3 4 5 6 7 var express = require ('express' );var app = express();var port = process.env.PORT || 3000 ;app.listen(port);
1 2 3 app.post('/' , function (req, res ) { res.send('POST request to homepage' ) })
1 2 3 4 5 6 7 app.set('title' , 'My Site' ); app.get('title' ) app.set("views" , "./views" ); app.set("view engine" , "ejs" );
1 2 3 4 5 6 app.use(function (req, res, next ) { console .log("Time: %d" , Date .now()); next(); })
Request
req.body
包含了請求所提交的 key-value 資料對,預設上是 undefined,但再使用中介層 (如:express.json(), express.urlencoded) 解析後會變成物件資料。
1 2 3 4 5 6 7 8 9 10 app.use(express.json()) app.use(express.urlencoded({ extended : true })) app.post("/profile" , function (req, res, next ) { console .log(req.body) res.json(req.body) })
Response
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 res.redirect("https://google.com" ) res.redirect("/admin" ) res.redirect("post/new" ) res.redirect(".." ) res.redirect('back' )
res.render(‘view’ [, locals] [, callback])
渲染 view 檔案 (如放在 views 資料夾下的 product.ejs 就是填入 “product”),並發送渲染過的 HTML 字串給客戶端。 view 參數是位於 views 資料夾下的,要被渲染檔案的路徑 (可為絕對路徑或是相對於 views 的路徑)。
locals 為物件,可將本地端的變數帶給 view 檔案使用。
1 2 3 4 5 6 7 res.render('index' ) res.render('user' , { name : 'Tobi' }, function (err, html ) { })
1 2 3 4 5 6 7 8 res.send(Buffer.from('whoop' )); res.send({ some : 'json' }); res.send('<p>some html</p>' ); res.status(404 ).send('Sorry, we cannot find that!' ); res.status(500 ).send({ error : 'something blew up' });
1 2 3 4 5 6 7 8 9 10 11 12 app.use(function (req, res ) { res.status(404 ).send("<h2>抱歉,找不到您要的頁面</h2>" ) }) app.use(function (req, res ) { res.status(500 ).send("<h2>伺服器程式出現問題,請稍後再試</h2>" ) }) res.status(403 ).end() res.status(400 ).send('Bad Request' ) res.status(404 ).sendFile('/absolute/path/to/404.png' )
中介層函式是一些有權存取請求物件 (req)、回應物件 (res)、下一個中介層 (next) 的函式。中介層函式能執行以下任務:
執行任何程式碼。
變更請求和回應物件。
結束請求 / 回應循環。
呼叫堆疊中的下一個中介層。
如果當前的中介層不會結束請求 / 回應循環,則必須呼叫 next() ,才能將控制權傳遞到下一個中介層,否則請求會停擺。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 var myLogger = function (req, res, next ) { console .log("Logged!" ); next(); }; var reqTime = function (req, res, next ) { req.reqTime = Date .now(); next(); }; app.use(reqTime); app.get('/' , function (req, res ) { var resText = "Hello, guest!" ; resText += "Requested at: " + req.reqTime + "" ; res.send(resText); }); app.listen(3000 );