node.js 21 express 參數(shù)獲取,模板引擎

本文參考原文-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ù)。

node.js 11 express 參數(shù)獲取,模板引擎

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ù)怎么獲取。

  1. 獲取用戶在網(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ù)值。

  1. 獲取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è)面顯示如圖

node.js 11 express 參數(shù)獲取,模板引擎

path傳參

  1. 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è)面如下。

node.js 11 express 參數(shù)獲取,模板引擎

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ù)。

node.js 11 express 參數(shù)獲取,模板引擎

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ù)怎么獲取。

  1. 獲取用戶在網(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ù)值。

  1. 獲取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è)面顯示如圖

node.js 11 express 參數(shù)獲取,模板引擎

path傳參

  1. 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è)面如下。

node.js 11 express 參數(shù)獲取,模板引擎

ejs

總結(jié)

express參數(shù)獲取的三種方式,模板引擎的使用和設(shè)置先介紹到這里。希望本篇能夠讓你在使用express的時(shí)候得到幫助。

如果有問(wèn)題,歡迎朋友們留言討論。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容