Express是這么定義自己的:一個(gè)輕量靈活的Node.js web 應(yīng)用框架诺擅。
啟動(dòng)服務(wù)器
使用原Node.js中的http模塊
const http = require("http");
http.createServer( (req,res)=> {
res.end("hello"); //瀏覽器打開localhost:3000會(huì)看到hello
}).listen(3000, ()=> {
console.log("3000"); //提示信息,可以忽略
});
使用Express框架
let express = require("express")
let app = new express();
app.get('/',(req,res)=>{
res.send("world");
})
app.listen(3000,()=>{
console.log("listining 3000 port");
})
其實(shí)調(diào)用express()生成的app是一個(gè)函數(shù),是作為了http中createServer的參數(shù)茬腿,調(diào)用app.listen()其實(shí)執(zhí)行的是http.createServer(app).listen()。
Express核心之中間件(middleware)
- Express的官方文檔有一句話說Express的本質(zhì)其實(shí)是一系列中間件的調(diào)用奕坟,中間件其實(shí)就是函數(shù)扒怖。
//普通中間件形式:
function middlewareName(req, res, next) {
// do something
}
//錯(cuò)誤處理中間件形式
function middlewareName(err, req, res, next) {
// do something
}
函數(shù)中的res和req分別指請求的response和request,err指錯(cuò)誤信息,next本身也是一個(gè)函數(shù)完残,調(diào)用next()就會(huì)執(zhí)行下一個(gè)中間件煞聪。
- 中間件分為注冊中間件和路由中間件
- 注冊中間件:通常用app.use()方法
- 路由中間件通常用app.Method()方法,
app.use('/user', function(req, res, next) {
// do something
});
app.get('/user', function(req, res, next) {
// do something //get方法可以用post蒂培,put,delete等替代
});
Express router
router也是express中很重要的一個(gè)東西积糯,簡單來說它是一個(gè)中間件的容器,app的很多API铝宵,例如:app.use()打掘,app.param(),app.handle()等鹏秋,事實(shí)上都是對Router的API的一個(gè)簡單包裝尊蚁。
看下面的例子:
let express = require("express")
let app = new express();
let router = express.Router();
router.get("/hello",(req,res)=>{
res.send("hello"); //瀏覽器中打開http://localhost:3000/router/hello會(huì)看到hello
})
router.get("/hi",(req,res)=>{
res.send("hi") //瀏覽器中打開http://localhost:3000/router/hi會(huì)看到hi
})
app.use("/router",router);
app.listen(3000,()=>{
console.log("listining 3000 port");
})
那么問題來了,前邊我沒有用router侣夷,直接實(shí)例化一個(gè)express對象app横朋,然后去寫中間件,不是照樣可以完成請求響應(yīng)么百拓,我目前在找了很多資料后是這樣理解的琴锭,一般我們會(huì)用app.use()去定義應(yīng)用程序級的根路由晰甚,router.Method()去定義子路由,多個(gè)子路由都是以那個(gè)根路由為開始的决帖。