express刚接触express的开发人员经常对路由处理程序和中间件之间的区别感到困惑。所以他们也对app.use()、app.all()、app.get()、app.post()、app.delete()和app.put()方法之间的区别感到困惑。在本文中,我将解释中间件和路由处理程序之间的区别。以及如何正确使用app.use()、app.all()、app.get()、app.post()、app.delete()和app.put()方法。路由处理app.use()、app.all()、app.get()、app.post()、app.delete()和app.put()都用于定义路由。这些方法用于定义路由。路由用于处理HTTP请求。路由是路径和请求路径匹配时执行的回调的组合。回调称为路由处理程序。它们之间的区别在于处理不同类型的HTTP请求。例如:app.get()方法只处理get请求,而app.all()处理GET、POST等请求。这是一个如何定义路由的示例:varapp=require("express")();app.get("/",function(req,res,next){res.send("HelloWorld!!!!");});app.listen(8080);每个路由处理程序都获取对它当前服务的HTTP请求的请求和响应对象的引用。可以为单个HTTP请求执行多个路由处理程序。这是一个例子:varapp=require("express")();app.get("/",function(req,res,next){res.write("Hello");next();});app.get("/",function(req,res,next){res.write("World!!!");res.end();});app.listen(8080);这里第一个句柄写一些响应,然后调用next()。next()方法用于调用与路由路径匹配的下一个路由处理程序。路由处理程序必须结束请求或调用下一个路由处理程序。我们还可以将多个路由处理程序传递给app.all()、app.get()、app.post()、app.delete()和app.put()方法。这里有一个例子来证明这一点:varapp=require("express")();app.get("/",function(req,res,next){res.write("Hello");next();},function(req,res,next){res.write("World!!!");res.end();});app.listen(8080);MiddlewareMiddleware是在程序之上进行实际请求处理Callbacks的地方。它采用与路由处理程序相同的参数。要了解中间件,让我们看一个带有仪表板和配置文件页面的示例站点。要访问这些页面,用户必须登录。对这些页面的请求也会被记录下来。以下是这些页面的路由处理程序的代码:varapp=require("express")();functioncheckLogin(){returnfalse;}functionlogRequest(){console.log("Newrequest");}app.get("/dashboard",function(req,res,next){logRequest();if(checkLogin()){res.send("这是仪表盘页面");}else{res.send("你是未登录!!!");}});app.get("/profile",function(req,res,next){logRequest();if(checkLogin()){res.send("这是仪表板页面");}else{res.send("你还没有登录!!!");}});app.listen(8080);这里的问题是有很多重复的代码,即我们必须做更多首先使用logRequest()和checkLogin()函数。这也使得更新代码变得困难。所以,为了解决这个问题,我们可以为这两个路径写一个公共路径。这是重写的代码:varapp=require("express")();functioncheckLogin(){returnfalse;}functionlogRequest(){console.log("Newrequest");}app.get("/*",function(req,res,next){logRequest();next();})app.get("/*",function(req,res,next){if(checkLogin()){next();}else{res("你没有登录!!!");}})app.get("/dashboard",function(req,res,next){res.send("这是仪表盘页面");});app.get("/profile",function(req,res,next){res.send("这是仪表盘页面");});app.listen(8080);看这里的代码它看起来更干净,更容易维护和更新。前两个定义的路由处理程序在这里称为中间件,因为它们不处理请求,但负责预处理它们。Express为我们提供了app.use()方法,专门用来定义中间件。app.use()方法可能看起来类似于app.all(),但有许多差异使app.use()成为声明中间件的理想选择。让我们看看app.use()方法是如何工作的:app.use()和app.all()的区别:CALLBACKapp.use()只需要一个回调,而app.all()可以进行多个回调。PATHapp.use()只检查url是否以指定路径开头,app.all()匹配完整路径。这里有一个例子来说明:app.use("/product",mymiddleware);//将匹配/product//将匹配/product/cool//将匹配/product/fooapp.all("/product",handler);//会匹配/product//不会匹配/product/cool<--important//不会匹配/product/foo<--importantapp.all("/product/*",handler);//不会匹配/product<--Important//会匹配/product/cool//会匹配/product/fooNEXT()next()insidemiddleware调用下一个中间件或路由处理程序,取决于连接陈述。但是路由处理程序中的next()仅调用下一个路由处理程序。如果接下来有中间件,则跳过。因此,必须在所有路由处理程序之前声明中间件。这里有一个例子来说明:varexpress=require('express');varapp=express();app.use(functionfrontControllerMiddlewareExecuted(req,res,next){console.log('(1)这个frontControllerMiddlewareExecuted被执行了');next();});app.all('*',function(req,res,next){console.log('(2)所有方法和路径模式“*”的路由中间件,首先执行并可以在下一步之前做一些事情');next();});app.all('/hello',function(req,res,next){console.log('(3)所有方法和路径模式的路由中间件“/你好”,第二个执行并且可以在下一步之前做一些事情');next();});app.use(functionfrontControllerMiddlewareNotExecuted(req,res,next){console.log('(4)这个frontControllerMiddlewareNotExecuted不是executed');next();});app.get('/hello',function(req,res){console.log('(5)方法GET和路径模式“/hello”的路由中间件,最后执行然后我发送响应');res.send('HelloWorld');});app.listen(80);现在我们看到了app.use()方法的唯一性以及为什么使用它来声明中间件让我们重写示例站点代码:varapp=require("express")();functioncheckLogin(){returnfalse;}functionlogRequest(){log("新请求");}app.use(function(req,res,next){logRequest();next();})app.use(function(req,res,next){if(checkLogin()){next();}else{res.send("你还没有登录!!!");}})app.get("/dashboard",function(req,res,next){res.send("这是仪表板页面");});app.get("/profile",function(req,res,next){res.send("这是仪表板页面");});app.listen(8080);
