最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Node Express用法詳解【安裝、使用、路由、中間件、模板引擎等】

 更新時間:2020年05月13日 10:47:53   作者:alogy  
這篇文章主要介紹了Node Express用法,結(jié)合實例形式詳細分析了node.js Express安裝、使用、路由、中間件、模板引擎等相關(guān)概念、原理及操作注意事項,需要的朋友可以參考下

本文實例講述了Node Express用法。分享給大家供大家參考,具體如下:

安裝

npm install --save express

基本使用

//引用express
var express = require('express');

//創(chuàng)建app
var app = express();

//羅列中間件
app.get('/',function( req,res ){
  res.send('index');
});

app.get('/new/:id',function( req,res ){
  res.send('news'+ res.params.id);
});

//開啟服務(wù)器,監(jiān)聽端口
app.listen(3000);

路由

express 路由

//路由小寫和大寫都可以。
var express = require('express');

var app = express();

app.get('/',function( req,res ) {
  res.send('get請求');
});
app.post('/',function( req,res ){  
  res.send('post請求');  
});
app.listen(1221);

get和post請求都可以

app.all('/',function( req,res ){
  res.send('get&post');
});
// 更推薦冒號寫法
app.get('/student/:id',function( req,res ){});
app.get('/:username/:id',function( req,res ){ res.write(username); res.end(id) });

有字符串正則系統(tǒng)

// 匹配 acd 和 abcd
app.get('/ab?cd', function(req, res) {
 res.send('ab?cd');
});

// 匹配 abcd、abbcd、abbbcd等
app.get('/ab+cd', function(req, res) {
 res.send('ab+cd');
});

// 匹配 abcd、abxcd、abRABDOMcd、ab123cd等
app.get('/ab*cd', function(req, res) {
 res.send('ab*cd');
});

// 匹配 /abe 和 /abcde
app.get('/ab(cd)?e', function(req, res) {
 res.send('ab(cd)?e');
});

正則表達式

// 匹配任何路徑中含有 a 的路徑:
app.get(/a/, function(req, res) {
 res.send('/a/');
});
// 路由中的正則表達式,可以使用分組捕獲,程序中使用req.params[0],req.params[1]來獲取
app.get(/student([\d]{1})\/class([\d]{2})$/,function( req,res ){
  console.log( req.params[0],req.params[1] );
});

表單提交

表單提交到本身頁面 // restful 路由設(shè)計

/* 
概念:
  /student 
    get // 讀取學生信息  // app.get('/student/:id',function(){});
    add // 添加學生信息   // app.add('/student/:id',function(){});
    delete // 刪除學生信息 // app.delete('/student/:id',function(){});
問題:web網(wǎng)頁中,大部分處理get和psot請求處理。
其它的服務(wù),可以是從軟件,或者app發(fā)出請求。一般restful是提供給app。
*/
       
app.get('/',function( req,res ){
  res.render('form.ejs');
});
app.post('/',function( req,res ){
  res.send('form表單提交');
});

中間件

中間件middleware ,少了一層回調(diào)。
所有的中間件,都將作為http.createServer();的回調(diào)。

中間件特點:

app.js中的代碼,程序執(zhí)行的時候運行,用戶來了之后,并不執(zhí)行。中間件中的代碼塊,每個用戶訪問的時候都會執(zhí)行一次。

具有跳樓現(xiàn)象,從上往下走,匹配一個就執(zhí)行,而不會執(zhí)行第二個。

app.get('/',function( req,res ){ res.send('A') });    
app.get('/',function( req,res ){ res.send('B') });   //執(zhí)行A,而不會執(zhí)行B

中間件的回調(diào)函數(shù)中有next參數(shù),表示繼續(xù)執(zhí)行下一個匹配的中間件。 //利用next(),用兩段小程序,來同時處理同一個請求。 把業(yè)務(wù)分開。 next() , 影響MVC。

app.get('/',function( req,res,next ){
  res.send( 'A' );
  next();
})

app.get('/',function( req,res,next ){
  res.send( 'B' );
})

//這兩個路由,感覺沒關(guān)系,實際上沖突了。
app.get('/:username/:id',function( req,res ){
  console.log(1);
  res.send('用戶信息'+ req.params[username]);
});

app.get('/admin/login',function( req,res ){
  console.log(2);
  res.send('管理員登陸');
});

解決方法

方法1:
調(diào)整路由上下位置 //利用匹配就有跳樓現(xiàn)象。 express 中 所有的路由 都是中間件,具體的路由往上寫,抽象的往下寫。

app.get('/admin/login',function( req,res ){ 
  console.log(2);
  res.send('管理員登陸');
});

app.get('/:username/:id',function( req,res ){
  console.log(1);
  res.send('用戶信息'+ req.params[username]);
});  

方法2: 匹配到最后,要有最終的路由來匹配于它。

//加上next()之后,匹配兩次,已經(jīng)被send()一次,會報錯。通過數(shù)據(jù)的判斷適當加next()

app.get('/:username/:id',function( req,res ){
  
  var username = req.paramse.username;
  //檢索數(shù)據(jù)庫,如果username不存在,那么才next()
  if( usernma ) {
    console.log(1);
    res.send('用戶信息'+ req.params[username]);
  } else {
    next();
  }

});

app.get('/admin/login',function( req,res ){
  console.log(2);
  res.send('管理員登陸');
}); 

app.use()

此時并不會進行任何路由匹配,都是執(zhí)行。一般處理404,和總體的返回編碼和狀態(tài)的使用。

// 多個路由都能夠匹配
app.use('/admin',function( req,res ){
  console.log(req.originUrl); // '/admin/new'
  console.log(req.baseUrl); // 'admin'
  console.log(req.path); // '/new'
  next();
});
// 任何網(wǎng)址都是 '/' 的拓展
app.use('/',function( req,res ){});
app.use(function( req,res ){}); // 可以不用第一個參數(shù) 直接就是 '/',就是所有網(wǎng)址了。
app.use(); //增加一些特定功能的便利場所。
// 實際上app.use(); //基本上都從第三方能得到。 -- 路由順序(落路)
app.use(user);
function user( req,res,next ){   
  var filePath = req.originalUrl;
  fs.readFile('./public/'+filePath,function( err,data ){
    if( err ){
      //文件不存在
      next()
      return ;
  }
    res.send(data.toSting());
  });
}
// 靜態(tài)服務(wù)
app.use(express.static('./public'));

// 路由的上下關(guān)系,很有關(guān)系, 是否匹配第一個,是否需要next()

// 一般習慣把靜態(tài)服務(wù)寫在前頭,后面的路由處理,一般不沖突。

 // 返回編碼和狀態(tài)
 app.use(function( req,res,next ){
  
  res.status(200);
  res.set('Content-Type','text/html;charset=utf-8');
  next();

});
//404 
app.use(function( req,res ){
  res.status(404);
  res.send('sorry');
});

render() & send()

大多數(shù)情況下,渲染內(nèi)容用res.render(),將會根據(jù)views的模板文件進行渲染,如果不想使用views文件夾,使用其它名字,

app.set('views','static');  

send(); //自動設(shè)置了Content-Type 頭部和200狀態(tài)碼。和 mime類型。 send() 和 end() 一樣。

get & post

get請求的參數(shù)在url中,在原生node中,需要使用url模塊來識別參數(shù)字符串,在express中,不需要使用url模塊。可以直接使用req.query對象。

post請求在express中不能直接獲得,必須使用body-parser模塊。使用后,將可用req.body得到參數(shù)。但是如果表單中含有文件上傳,那么還是需要使用formidable模塊

post使用到的第三方模塊:body-parser,formidable

var express = require('express');
var bodyParser = require('body-parser');
var app = express();

// 設(shè)置模板
app.set('view engine','ejs');
app.use(bodyParser.urlencoded({ extended: false }));

// router
app.get('/',function( req,res ){
 res.render('form.ejs');
});

app.post('/',function( req,res ){
 console.log(req.body);
}); 

靜態(tài)化文件

利用expres.static(root); // root 參數(shù)指的是靜態(tài)資源文件所在的根目錄。

// app.use方法實際上是將中間件保存在一個數(shù)組中,注冊路由時,依次將數(shù)組的元素取出
app.use(express.static('./static'));
app.use('page',epxress.static('./static')); // page/index.html 

模板引擎

和 express 結(jié)合的模板是:jade,ejs
(ejs)[https://www.npmjs.com/package/ejs%5D

var express = require('express');
var app = express();

// 設(shè)置模板引擎,設(shè)置為ejs
app.set('view engine','ejs');

// 路由
app.get('/',function( req,res ){
  //render: 第二個參數(shù)是,字典。
  res.render('index.ejs',{
    'name': [ting,daie]
  });
});  
app.listen(1221);

對應的模板為:

<ul>
  <%
    for( var i=0; i<name.length; i++ ){
  %>
    <li><%=name[i]%></li>
  <%
    }
  %>
</ul>

默認的視圖文件夾,views。如果不想使用默認的 app.set('views','./shitu');

希望本文所述對大家node.js程序設(shè)計有所幫助。

相關(guān)文章

  • nodejs不用electron實現(xiàn)打開文件資源管理器并選擇文件

    nodejs不用electron實現(xiàn)打開文件資源管理器并選擇文件

    最近在開發(fā)一些小腳本,用 nodejs 實現(xiàn),其中很多功能需要選擇一個/多個文件,或者是選擇一個文件夾,這種情況下網(wǎng)上給出的解決方案都是 electron,但是我一個小腳本用 electron 屬實有點夸張了,后來轉(zhuǎn)念一想可以通過 powershell 來實現(xiàn)類似的功能,需要的朋友可以參考下
    2024-01-01
  • NodeJS后端開發(fā)操作文件之讀寫文件

    NodeJS后端開發(fā)操作文件之讀寫文件

    這篇文章主要介紹了NodeJS后端開發(fā)操作文件之讀寫文件,操作文件是服務(wù)端一個基礎(chǔ)的功能,也是做后端開發(fā)的必備能力之一,操作文件主要包括讀和寫。而這些功能NodeJS都已經(jīng)提供了對應的方法
    2022-06-06
  • 安裝 node-Sass 報錯的解決記錄(三步解決法)

    安裝 node-Sass 報錯的解決記錄(三步解決法)

    本文主要介紹了安裝 node-Sass 報錯的解決記錄(三步解決法),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-05-05
  • 深入nodejs中流(stream)的理解

    深入nodejs中流(stream)的理解

    本篇文章主要介紹了深入nodejs中流(stream)的理解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-03-03
  • node.js中的events.emitter.listeners方法使用說明

    node.js中的events.emitter.listeners方法使用說明

    這篇文章主要介紹了node.js中的events.emitter.listeners方法使用說明,本文介紹了events.emitter.listeners 的方法說明、語法、接收參數(shù)、使用實例和實現(xiàn)源碼,需要的朋友可以參考下
    2014-12-12
  • 詳解Node.js中的模塊化方法

    詳解Node.js中的模塊化方法

    這篇文章主要為大家介紹了Node.js的模塊化,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • Node搭建https服務(wù)器實例詳解

    Node搭建https服務(wù)器實例詳解

    這篇文章主要介紹了Node搭建https服務(wù)器的方法,結(jié)合實例形式詳細分析了創(chuàng)建ssl證書以及node.js調(diào)用https模塊搭建https服務(wù)器的相關(guān)操作技巧,需要的朋友可以參考下
    2023-04-04
  • 使用Typescript和ES模塊發(fā)布Node模塊的方法

    使用Typescript和ES模塊發(fā)布Node模塊的方法

    這篇文章主要介紹了使用Typescript和ES模塊發(fā)布Node模塊的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-05-05
  • Nodejs使用pkg打包為可執(zhí)行文件的解決方案

    Nodejs使用pkg打包為可執(zhí)行文件的解決方案

    使用pkg將Node.js項目打包為可執(zhí)行文件時,可能會遇到一些常見的錯誤,如未指定目標平臺、在遠程緩存中找不到基礎(chǔ)Node.js二進制文件等,本文介紹了如何通過配置package.json中的bin入口、手動下載指定版本的Node.js二進制文件到本地.pkg-cache目錄解決這些問題
    2024-11-11
  • Node.js中.npmrc文件的配置實現(xiàn)

    Node.js中.npmrc文件的配置實現(xiàn)

    .npmrc?文件是 npm 配置的核心文件,用于管理 npm 的行為,本文就來介紹一下Node .npmrc文件配置,具有一定的參考價值,感興趣的可以了解一下
    2024-12-12

最新評論

垦利县| 秦安县| 玉田县| 临沧市| 天等县| 焦作市| 金阳县| 梓潼县| 新河县| 武强县| 元朗区| 南通市| 深州市| 攀枝花市| 正宁县| 吴忠市| 琼中| 资兴市| 沙坪坝区| 古浪县| 湘潭市| 盐源县| 鹤山市| 克什克腾旗| 二连浩特市| 清原| 南江县| 抚州市| 井陉县| 萨嘎县| 云浮市| 大化| 安达市| 太白县| 台中县| 仁寿县| 宁河县| 肇源县| 瑞金市| 江北区| 青河县|