Express是这么定义自己的:一个轻量灵活的Node.js web 应用框架。
启动服务器
使用原Node.js中的http模块
const http = require("http");
http.createServer( (req,res)=> {
res.end("hello"); //浏览器打开localhost:3000会看到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");
})
其实调用express()生成的app是一个函数,是作为了http中createServer的参数,调用app.listen()其实执行的是http.createServer(app).listen()。
Express核心之中间件(middleware)
- Express的官方文档有一句话说Express的本质其实是一系列中间件的调用,中间件其实就是函数。
//普通中间件形式:
function middlewareName(req, res, next) {
// do something
}
//错误处理中间件形式
function middlewareName(err, req, res, next) {
// do something
}
函数中的res和req分别指请求的response和request,err指错误信息,next本身也是一个函数,调用next()就会执行下一个中间件。
- 中间件分为注册中间件和路由中间件
- 注册中间件:通常用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中很重要的一个东西,简单来说它是一个中间件的容器,app的很多API,例如:app.use(),app.param(),app.handle()等,事实上都是对Router的API的一个简单包装。
看下面的例子:
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会看到hello
})
router.get("/hi",(req,res)=>{
res.send("hi") //浏览器中打开http://localhost:3000/router/hi会看到hi
})
app.use("/router",router);
app.listen(3000,()=>{
console.log("listining 3000 port");
})
那么问题来了,前边我没有用router,直接实例化一个express对象app,然后去写中间件,不是照样可以完成请求响应么,我目前在找了很多资料后是这样理解的,一般我们会用app.use()去定义应用程序级的根路由,router.Method()去定义子路由,多个子路由都是以那个根路由为开始的。