本文參考原文-http://bjbsair.com/2020-03-22/tech-info/2823.html
今天上午看到有朋友留言問(wèn)我,現(xiàn)在是不是流行koa2了。確實(shí),國(guó)內(nèi)看用koa2的不少,不過(guò)整個(gè)global來(lái)看,express的使用量依然很高,并且由于express出現(xiàn)的早,整個(gè)生態(tài)比較完備,所以還將會(huì)在很長(zhǎng)一段時(shí)間內(nèi)擁有較多的用戶。
個(gè)人比較認(rèn)可數(shù)據(jù),剛剛?cè)pm網(wǎng)站看了一下express和koa的下載量。對(duì)比圖如下,今早新鮮出爐的數(shù)據(jù)。
express VS koa
express的周下載量達(dá)到了1190萬(wàn),koa的周下載量目前是41萬(wàn)。盡管目前下載量對(duì)比express占優(yōu),但是koa具有自己的優(yōu)勢(shì),后面我會(huì)有文章專門介紹koa。實(shí)際工作中,一方面我們需要使用成熟穩(wěn)定的技術(shù),但是也不能放松對(duì)新技術(shù),新事物的了解,否則很快就會(huì)被這個(gè)飛速發(fā)展的時(shí)代拋下。IT人是需要活到老,學(xué)到老的。
接下來(lái),回到本章需要介紹的內(nèi)容。
express 參數(shù)獲取
這里的參數(shù)分成幾類,一類是用戶在網(wǎng)頁(yè)form中輸入的信息,一類是url path中的信息,還有就是post中的參數(shù)怎么獲取。
- 獲取用戶在網(wǎng)頁(yè)form中輸入的信息
如果form使用的是GET方法,form中的信息會(huì)以下列形式在url中進(jìn)行傳遞。
http://localhost:3000/create?name=Vincent&age=18
這個(gè)示例中form中有兩個(gè)元素,分別是name和age。提交時(shí),參數(shù)以這樣的形式添加在url后面發(fā)送到服務(wù)端。
還是那句話,框架需要提供對(duì)原生功能的包裝,盡可能讓使用者快捷簡(jiǎn)單的使用功能。在express中,網(wǎng)頁(yè)form的數(shù)據(jù)提交到服務(wù)端后,數(shù)據(jù)以鍵值對(duì)的形式保存在request.query對(duì)象中。獲取參數(shù)值,只需要使用request.query.<param>即可,示例如下:
let name = request.query.name;
假設(shè)我在瀏覽器的"name"文本框輸入值Vincent,那么上面的代碼就能夠獲取到"Vincent"。
比起node.js原生的獲取參數(shù)的方法,express便捷了很多。node.js原生獲取form中參數(shù)的方法需要首先手動(dòng)引入url包,通過(guò)parse后,在調(diào)用query后獲取參數(shù)值。
- 獲取url path中的參數(shù)
隨著rest方式的普及,調(diào)用rest api時(shí),會(huì)將參數(shù)值直接放在url的path中。示例,假設(shè)我們需要通過(guò)用戶的名稱獲取用戶的詳細(xì)信息,那么可以采用下列的url
http://localhost:3000/user/Vincent
在服務(wù)端的app.js中,首先要添加下列路由"/user/:name"。然后通過(guò)request.params獲取參數(shù)的鍵值對(duì)。和form里面的參數(shù)保存不一樣,path中的參數(shù)保存在request.params中。
app.get('/user/:name', function userIdHandler (req, res) {
console.log(req.params)
})
那么我們?cè)诳刂婆_(tái)可以看到下列信息,name的鍵值對(duì)在對(duì)象request.params中。
{ name: 'Vincent' }
GET /user/Vincent 200 16.076 ms - 13
如果我們要傳遞多個(gè)參數(shù),可以在path后面繼續(xù)添加參數(shù)。
http://localhost:3000/user/Vincent/age/18
在app.js中添加路由"/user/:name/age:age"。
app.use('/user/:name/age/:age',function(req, res, next) {
console.log(req.params);
res.send("name: " + req.params.name + ", age: " + req.params.age);
});
這是控制臺(tái)輸出里面就會(huì)多出age的鍵值對(duì)。
{ name: 'Vincent', age: '18' }
GET /user/Vincent/age/18 304 3.396 ms - -
頁(yè)面顯示如圖
path傳參
- POST方法傳參
在第一點(diǎn)中我們采用的時(shí)form的GET方法傳參,這是參數(shù)存放在request.query中。如果通過(guò)POST方法傳參,參數(shù)保存在request.body中。
在app.js中,仍然使用app.js調(diào)用相關(guān)的router,假設(shè)此處我們使用的router名稱是createRouter。
app.use('/create', createRouter);
在createRouter對(duì)應(yīng)的js文件中,使用router.post()方法。
router.post('/', function(req, res, next) {
console.log("----------------------------------------------")
console.log(req.body)
console.log("----------------------------------------------")
});
運(yùn)行后,我們可以看到在控制臺(tái)req.body的信息,這個(gè)一個(gè)對(duì)象,里面的信息以鍵值對(duì)的形式保存。
----------------------------------------------
[Object: null prototype] {
name: 'Vincent',
age: '18'
}
----------------------------------------------
express 模板引擎
java的web應(yīng)用會(huì)使用jsp作為view,早期的應(yīng)用會(huì)直接通過(guò)servlet加html模板的方式,再好比現(xiàn)在Spring + thymeleaf。當(dāng)然現(xiàn)在的前端技術(shù)已經(jīng)日新月異了,各種前端框架層出不窮。作為一個(gè)web框架來(lái)講,一定會(huì)有相關(guān)與前端配合的功能,否則得不到很好的使用和推廣。
express默認(rèn)支持多個(gè)模板引擎。在安裝了express generator(可以參照我的上一篇express介紹進(jìn)行安裝)后,只需要在命令行輸入"express -h"就可以看到所有的參數(shù)選項(xiàng)了。
D:\Projects\nodejs\NodeDemo\forms>express -h
Usage: express [options] [dir]
Options:
--version output the version number
-e, --ejs add ejs engine support
--pug add pug engine support
--hbs add handlebars engine support
-H, --hogan add hogan.js engine support
-v, --view <engine> add view <engine> support (dust|ejs|hbs|hjs|jade|pug|twig|vash) (defaults to jade)
--no-view use static html instead of view engine
-c, --css <engine> add stylesheet <engine> support (less|stylus|compass|sass) (defaults to plain css)
--git add .gitignore
-f, --force force on non-empty directory
-h, --help output usage information
在這里,我們可以看到默認(rèn)的模板引擎時(shí)jade,除了jade,還支持dust|ejs|hbs|hjs|jade|pug|twig|vash等模板引擎。
在運(yùn)行命令"express"創(chuàng)建項(xiàng)目文件時(shí),在app.js中默認(rèn)使用的引擎是jade。
// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');
如果需要使用其他引擎來(lái)替代jade,比如ejs, 可以在創(chuàng)建項(xiàng)目時(shí)使用"express -e"命令。
如果項(xiàng)目已經(jīng)創(chuàng)建完成,引擎將被切換為"ejs",仍然可以使用上述的命令。
D:\Projects\nodejs\NodeDemo\node10>express -e
warning: option `--ejs' has been renamed to `--view=ejs'
destination is not empty, continue? [y/N] y
create : public\
create : public\javascripts\
create : public\images\
create : public\stylesheets\
create : public\stylesheets\style.css
create : routes\
create : routes\index.js
create : routes\\users.js
create : views\
create : views\error.ejs
create : views\index.ejs
create : app.js
create : package.json
create : bin\
create : bin\www
同時(shí)該命令還會(huì)將app.js中的設(shè)置引擎的代碼進(jìn)行修改。
app.set('view engine', 'ejs');
這還不夠,需要在當(dāng)前的項(xiàng)目目錄下安裝ejs才能在后續(xù)運(yùn)行。
D:\Projects\nodejs\NodeDemo\node10>npm install ejs --save
+ ejs@2.6.2
added 1 package from 2 contributors, removed 47 packages and audited 141 packages in 3.64s
found 0 vulnerabilities
個(gè)人選用ejs,因?yàn)樵趀js中變量的寫(xiě)法跟jsp基本相同,采用<%=variable%>的形式。
<body>
<h1><%= title %></h1>
<p>Welcome to <%= title %></p>
</body>
使用時(shí),只需要在router中將值傳給變量即可。
router.get('/', function(req, res, next) {
res.render('index', { title: 'Express' });
});
上面的代碼中"index"表示使用index模板,即<project>/views/index.ejs。{title:'Express'}表示該模板使用的變量。傳入之后,替代index.ejs中的<%= title %>,最后得到的頁(yè)面如下。
ejs
總結(jié)
express參數(shù)獲取的三種方式,模板引擎的使用和設(shè)置先介紹到這里。希望本篇能夠讓你在使用express的時(shí)候得到幫助。
如果有問(wèn)題,歡迎朋友們留言討論。本文參考原文-http://bjbsair.com/2020-03-22/tech-info/2823/
今天上午看到有朋友留言問(wèn)我,現(xiàn)在是不是流行koa2了。確實(shí),國(guó)內(nèi)看用koa2的不少,不過(guò)整個(gè)global來(lái)看,express的使用量依然很高,并且由于express出現(xiàn)的早,整個(gè)生態(tài)比較完備,所以還將會(huì)在很長(zhǎng)一段時(shí)間內(nèi)擁有較多的用戶。
個(gè)人比較認(rèn)可數(shù)據(jù),剛剛?cè)pm網(wǎng)站看了一下express和koa的下載量。對(duì)比圖如下,今早新鮮出爐的數(shù)據(jù)。
express VS koa
express的周下載量達(dá)到了1190萬(wàn),koa的周下載量目前是41萬(wàn)。盡管目前下載量對(duì)比express占優(yōu),但是koa具有自己的優(yōu)勢(shì),后面我會(huì)有文章專門介紹koa。實(shí)際工作中,一方面我們需要使用成熟穩(wěn)定的技術(shù),但是也不能放松對(duì)新技術(shù),新事物的了解,否則很快就會(huì)被這個(gè)飛速發(fā)展的時(shí)代拋下。IT人是需要活到老,學(xué)到老的。
接下來(lái),回到本章需要介紹的內(nèi)容。
express 參數(shù)獲取
這里的參數(shù)分成幾類,一類是用戶在網(wǎng)頁(yè)form中輸入的信息,一類是url path中的信息,還有就是post中的參數(shù)怎么獲取。
- 獲取用戶在網(wǎng)頁(yè)form中輸入的信息
如果form使用的是GET方法,form中的信息會(huì)以下列形式在url中進(jìn)行傳遞。
http://localhost:3000/create?name=Vincent&age=18
這個(gè)示例中form中有兩個(gè)元素,分別是name和age。提交時(shí),參數(shù)以這樣的形式添加在url后面發(fā)送到服務(wù)端。
還是那句話,框架需要提供對(duì)原生功能的包裝,盡可能讓使用者快捷簡(jiǎn)單的使用功能。在express中,網(wǎng)頁(yè)form的數(shù)據(jù)提交到服務(wù)端后,數(shù)據(jù)以鍵值對(duì)的形式保存在request.query對(duì)象中。獲取參數(shù)值,只需要使用request.query.<param>即可,示例如下:
let name = request.query.name;
假設(shè)我在瀏覽器的"name"文本框輸入值Vincent,那么上面的代碼就能夠獲取到"Vincent"。
比起node.js原生的獲取參數(shù)的方法,express便捷了很多。node.js原生獲取form中參數(shù)的方法需要首先手動(dòng)引入url包,通過(guò)parse后,在調(diào)用query后獲取參數(shù)值。
- 獲取url path中的參數(shù)
隨著rest方式的普及,調(diào)用rest api時(shí),會(huì)將參數(shù)值直接放在url的path中。示例,假設(shè)我們需要通過(guò)用戶的名稱獲取用戶的詳細(xì)信息,那么可以采用下列的url
http://localhost:3000/user/Vincent
在服務(wù)端的app.js中,首先要添加下列路由"/user/:name"。然后通過(guò)request.params獲取參數(shù)的鍵值對(duì)。和form里面的參數(shù)保存不一樣,path中的參數(shù)保存在request.params中。
app.get('/user/:name', function userIdHandler (req, res) {
console.log(req.params)
})
那么我們?cè)诳刂婆_(tái)可以看到下列信息,name的鍵值對(duì)在對(duì)象request.params中。
{ name: 'Vincent' }
GET /user/Vincent 200 16.076 ms - 13
如果我們要傳遞多個(gè)參數(shù),可以在path后面繼續(xù)添加參數(shù)。
http://localhost:3000/user/Vincent/age/18
在app.js中添加路由"/user/:name/age:age"。
app.use('/user/:name/age/:age',function(req, res, next) {
console.log(req.params);
res.send("name: " + req.params.name + ", age: " + req.params.age);
});
這是控制臺(tái)輸出里面就會(huì)多出age的鍵值對(duì)。
{ name: 'Vincent', age: '18' }
GET /user/Vincent/age/18 304 3.396 ms - -
頁(yè)面顯示如圖
path傳參
- POST方法傳參
在第一點(diǎn)中我們采用的時(shí)form的GET方法傳參,這是參數(shù)存放在request.query中。如果通過(guò)POST方法傳參,參數(shù)保存在request.body中。
在app.js中,仍然使用app.js調(diào)用相關(guān)的router,假設(shè)此處我們使用的router名稱是createRouter。
app.use('/create', createRouter);
在createRouter對(duì)應(yīng)的js文件中,使用router.post()方法。
router.post('/', function(req, res, next) {
console.log("----------------------------------------------")
console.log(req.body)
console.log("----------------------------------------------")
});
運(yùn)行后,我們可以看到在控制臺(tái)req.body的信息,這個(gè)一個(gè)對(duì)象,里面的信息以鍵值對(duì)的形式保存。
----------------------------------------------
[Object: null prototype] {
name: 'Vincent',
age: '18'
}
----------------------------------------------
express 模板引擎
java的web應(yīng)用會(huì)使用jsp作為view,早期的應(yīng)用會(huì)直接通過(guò)servlet加html模板的方式,再好比現(xiàn)在Spring + thymeleaf。當(dāng)然現(xiàn)在的前端技術(shù)已經(jīng)日新月異了,各種前端框架層出不窮。作為一個(gè)web框架來(lái)講,一定會(huì)有相關(guān)與前端配合的功能,否則得不到很好的使用和推廣。
express默認(rèn)支持多個(gè)模板引擎。在安裝了express generator(可以參照我的上一篇express介紹進(jìn)行安裝)后,只需要在命令行輸入"express -h"就可以看到所有的參數(shù)選項(xiàng)了。
D:\Projects\nodejs\NodeDemo\forms>express -h
Usage: express [options] [dir]
Options:
--version output the version number
-e, --ejs add ejs engine support
--pug add pug engine support
--hbs add handlebars engine support
-H, --hogan add hogan.js engine support
-v, --view <engine> add view <engine> support (dust|ejs|hbs|hjs|jade|pug|twig|vash) (defaults to jade)
--no-view use static html instead of view engine
-c, --css <engine> add stylesheet <engine> support (less|stylus|compass|sass) (defaults to plain css)
--git add .gitignore
-f, --force force on non-empty directory
-h, --help output usage information
在這里,我們可以看到默認(rèn)的模板引擎時(shí)jade,除了jade,還支持dust|ejs|hbs|hjs|jade|pug|twig|vash等模板引擎。
在運(yùn)行命令"express"創(chuàng)建項(xiàng)目文件時(shí),在app.js中默認(rèn)使用的引擎是jade。
// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');
如果需要使用其他引擎來(lái)替代jade,比如ejs, 可以在創(chuàng)建項(xiàng)目時(shí)使用"express -e"命令。
如果項(xiàng)目已經(jīng)創(chuàng)建完成,引擎將被切換為"ejs",仍然可以使用上述的命令。
D:\Projects\nodejs\NodeDemo\node10>express -e
warning: option `--ejs' has been renamed to `--view=ejs'
destination is not empty, continue? [y/N] y
create : public\
create : public\javascripts\
create : public\images\
create : public\stylesheets\
create : public\stylesheets\style.css
create : routes\
create : routes\index.js
create : routes\\users.js
create : views\
create : views\error.ejs
create : views\index.ejs
create : app.js
create : package.json
create : bin\
create : bin\www
同時(shí)該命令還會(huì)將app.js中的設(shè)置引擎的代碼進(jìn)行修改。
app.set('view engine', 'ejs');
這還不夠,需要在當(dāng)前的項(xiàng)目目錄下安裝ejs才能在后續(xù)運(yùn)行。
D:\Projects\nodejs\NodeDemo\node10>npm install ejs --save
+ ejs@2.6.2
added 1 package from 2 contributors, removed 47 packages and audited 141 packages in 3.64s
found 0 vulnerabilities
個(gè)人選用ejs,因?yàn)樵趀js中變量的寫(xiě)法跟jsp基本相同,采用<%=variable%>的形式。
<body>
<h1><%= title %></h1>
<p>Welcome to <%= title %></p>
</body>
使用時(shí),只需要在router中將值傳給變量即可。
router.get('/', function(req, res, next) {
res.render('index', { title: 'Express' });
});
上面的代碼中"index"表示使用index模板,即<project>/views/index.ejs。{title:'Express'}表示該模板使用的變量。傳入之后,替代index.ejs中的<%= title %>,最后得到的頁(yè)面如下。
ejs
總結(jié)
express參數(shù)獲取的三種方式,模板引擎的使用和設(shè)置先介紹到這里。希望本篇能夠讓你在使用express的時(shí)候得到幫助。
如果有問(wèn)題,歡迎朋友們留言討論。