這篇文章主要講解了如何使用Node Express,內容清晰明了,對此有興趣的小伙伴可以學習一下,相信大家閱讀完之后會有幫助。
安裝
npm install --save express
//引用express var express = require('express'); //創建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); }); //開啟服務器,監聽端口 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);
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) });
// 匹配 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 路由設計
/* 概念: /student get // 讀取學生信息 // app.get('/student/:id',function(){}); add // 添加學生信息 // app.add('/student/:id',function(){}); delete // 刪除學生信息 // app.delete('/student/:id',function(){}); 問題:web網頁中,大部分處理get和psot請求處理。 其它的服務,可以是從軟件,或者app發出請求。一般restful是提供給app。 */ app.get('/',function( req,res ){ res.render('form.ejs'); }); app.post('/',function( req,res ){ res.send('form表單提交'); });
中間件middleware
,少了一層回調。
所有的中間件,都將作為http.createServer();
的回調。
app.js中的代碼,程序執行的時候運行,用戶來了之后,并不執行。中間件中的代碼塊,每個用戶訪問的時候都會執行一次。
具有跳樓現象,從上往下走,匹配一個就執行,而不會執行第二個。
app.get('/',function( req,res ){ res.send('A') }); app.get('/',function( req,res ){ res.send('B') }); //執行A,而不會執行B
中間件的回調函數中有next參數,表示繼續執行下一個匹配的中間件。 //利用next(),用兩段小程序,來同時處理同一個請求。 把業務分開。 next() , 影響MVC。
app.get('/',function( req,res,next ){ res.send( 'A' ); next(); }) app.get('/',function( req,res,next ){ res.send( 'B' ); }) //這兩個路由,感覺沒關系,實際上沖突了。 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:
調整路由上下位置 //利用匹配就有跳樓現象。 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()之后,匹配兩次,已經被send()一次,會報錯。通過數據的判斷適當加next() app.get('/:username/:id',function( req,res ){ var username = req.paramse.username; //檢索數據庫,如果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('管理員登陸'); });
此時并不會進行任何路由匹配,都是執行。一般處理404,和總體的返回編碼和狀態的使用。
// 多個路由都能夠匹配 app.use('/admin',function( req,res ){ console.log(req.originUrl); // '/admin/new' console.log(req.baseUrl); // 'admin' console.log(req.path); // '/new' next(); }); // 任何網址都是 '/' 的拓展 app.use('/',function( req,res ){}); app.use(function( req,res ){}); // 可以不用第一個參數 直接就是 '/',就是所有網址了。 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()); }); } // 靜態服務 app.use(express.static('./public')); // 路由的上下關系,很有關系, 是否匹配第一個,是否需要next() // 一般習慣把靜態服務寫在前頭,后面的路由處理,一般不沖突。 // 返回編碼和狀態 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'); });
大多數情況下,渲染內容用res.render()
,將會根據views的模板文件進行渲染,如果不想使用views文件夾,使用其它名字,
app.set('views','static');
send(); //自動設置了Content-Type 頭部和200狀態碼。和 mime類型。 send() 和 end() 一樣。
get請求的參數在url中,在原生node中,需要使用url模塊來識別參數字符串,在express中,不需要使用url模塊??梢灾苯邮褂?code>req.query對象。
post請求在express中不能直接獲得,必須使用body-parser
模塊。使用后,將可用req.body
得到參數。但是如果表單中含有文件上傳,那么還是需要使用formidable模塊
。
post使用到的第三方模塊:body-parser
,formidable
var express = require('express'); var bodyParser = require('body-parser'); var app = express(); // 設置模板 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); });
利用expres.static(root);
// root 參數指的是靜態資源文件所在的根目錄。
// app.use方法實際上是將中間件保存在一個數組中,注冊路由時,依次將數組的元素取出 app.use(express.static('./static')); app.use('page',epxress.static('./static')); // page/index.html
和 express 結合的模板是:jade
,ejs
(ejs)[https://www.npmjs.com/package/ejs%5D
var express = require('express'); var app = express(); // 設置模板引擎,設置為ejs app.set('view engine','ejs'); // 路由 app.get('/',function( req,res ){ //render: 第二個參數是,字典。 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 Express有進一步的了解,如果還想學習更多內容,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。