摘要:所有的中間件,都將作為的回調。執(zhí)行,而不會執(zhí)行中間件的回調函數(shù)中有參數(shù),表示繼續(xù)執(zhí)行下一個匹配的中間件。用戶信息管理員登陸解決方法方法調整路由上下位置利用匹配就有跳樓現(xiàn)象。一般處理,和總體的返回編碼和狀態(tài)的使用。
安裝
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); }); //開啟服務器,監(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 路由設計
/* 概念: /student get // 讀取學生信息 // app.get("/student/:id",function(){}); add // 添加學生信息 // app.add("/student/:id",function(){}); delete // 刪除學生信息 // app.delete("/student/:id",function(){}); 問題:web網頁中,大部分處理get和psot請求處理。 其它的服務,可以是從軟件,或者app發(fā)出請求。一般restful是提供給app。 */ app.get("/",function( req,res ){ res.render("form.ejs"); }); app.post("/",function( req,res ){ res.send("form表單提交"); });中間件
中間件middleware ,少了一層回調。
所有的中間件,都將作為http.createServer();的回調。
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
中間件的回調函數(shù)中有next參數(shù),表示繼續(xù)執(zhí)行下一個匹配的中間件。 //利用next(),用兩段小程序,來同時處理同一個請求。 把業(yè)務分開。 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:
調整路由上下位置 //利用匹配就有跳樓現(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()之后,匹配兩次,已經被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(); }); // 任何網址都是 "/" 的拓展 app.use("/",function( req,res ){}); app.use(function( req,res ){}); // 可以不用第一個參數(shù) 直接就是 "/",就是所有網址了。 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)服務 app.use(express.static("./public")); // 路由的上下關系,很有關系, 是否匹配第一個,是否需要next() // 一般習慣把靜態(tài)服務寫在前頭,后面的路由處理,一般不沖突。 // 返回編碼和狀態(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ù)情況下,渲染內容用res.render(),將會根據(jù)views的模板文件進行渲染,如果不想使用views文件夾,使用其它名字,
app.set("views","static");
send(); //自動設置了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(); // 設置模板 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 結合的模板是:jade,ejs
(ejs)[https://www.npmjs.com/package...
var express = require("express"); var app = express(); // 設置模板引擎,設置為ejs app.set("view engine","ejs"); // 路由 app.get("/",function( req,res ){ //render: 第二個參數(shù)是,字典。 res.render("index.ejs",{ "name": [ting,daie] }); }); app.listen(1221);
對應的模板為:
默認的視圖文件夾,views。如果不想使用默認的 app.set("views","./shitu");
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/86322.html
閱讀 1833·2021-11-25 09:43
閱讀 1335·2021-11-22 15:08
閱讀 3735·2021-11-22 09:34
閱讀 3225·2021-09-04 16:40
閱讀 3001·2021-09-04 16:40
閱讀 542·2019-08-30 15:54
閱讀 1334·2019-08-29 17:19
閱讀 1752·2019-08-28 18:13