您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

express.js中间件的介绍(附示例)

2026/1/6 7:38:00发布18次查看
本篇文章给大家带来的内容是关于express.js中间件的介绍(附示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。
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等请求。
下面是一个例子,如何定义一个路由:
var app = require(express)();app.get(/, function(req, res, next){    res.send(hello world!!!!);});app.listen(8080);
每个路由处理程序都获得对当前正在提供的http请求的请求和响应对象的引用。
可以为单个http请求执行多个路由处理程序。这是一个例子:var app = 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()方法。
这是一个证明这一点的例子:var app = require(express)();app.get(/, function(req, res, next){    res.write(hello);    next();}, function(req, res, next){    res.write( world !!!);    res.end();});app.listen(8080);
中间件中间件是一个位于实际请求处理程序之上的回调。它采用与路由处理程序相同的参数。
要了解中间件,我们来看一个带有dashboard和profile页面的示例站点。要访问这些页面,用户必须登录。还会记录对这些页面的请求。
以下是这些页面的路由处理程序的代码:var app = require(express)();function checklogin(){    return false;}function logrequest(){    console.log(new request);}app.get(/dashboard, function(req, res, next){    logrequest();    if(checklogin()){        res.send(this is the dashboard page);    }    else{        res.send(you are not logged in!!!);    }});app.get(/profile, function(req, res, next){    logrequest();    if(checklogin()){        res.send(this is the dashboard page);    }    else{        res.send(you are not logged in!!!);    }});app.listen(8080);
这里的问题是有很多重复的代码,即我们不得不多次使用logrequest()和checklogin()函数。这也使得更新代码变得困难。因此,为了解决这个问题,我们可以为这两条路径编写一条通用路径。
这是重写的代码:var app = require(express)();function checklogin(){    return false;}function logrequest(){    console.log(new request);}app.get(/*, function(req, res, next){    logrequest();    next();})app.get(/*, function(req, res, next){    if(checklogin()){        next();    }    else{        res(you are not logged in!!!);    }})app.get(/dashboard, function(req, res, next){    res.send(this is the dashboard page);});app.get(/profile, function(req, res, next){    res.send(this is the dashboard page);});app.listen(8080);
这里的代码看起来更清晰,更易于维护和更新。这里将前两个定义的路由处理程序称为中间件,因为它们不处理请求,而是负责预处理请求。
express为我们提供了app.use()方法,该方法专门用于定义中间件。 app.use()方法可能看起来与app.all()类似,但它们之间存在很多差异,这使得app.use()非常适合于声明中间件。让我们看看app.use()方法是如何工作的:
app.use() 和 app.all() 的不同:
callback
app.use()只需要一个回调,而app.all()可以进行多次回调。
path
app.use()只查看url是否以指定路径开头,app.all()匹配完整路径。
这里有一个例子来说明:app.use( /product , mymiddleware);// will match /product// will match /product/cool// will match /product/fooapp.all( /product , handler);// will match /product// won't match /product/cool   <-- important// won't match /product/foo    <-- importantapp.all( /product/* , handler);// won't match /product        <-- important// will match /product/cool// will match /product/foo
next()
中间件内的next()调用下一个中间件或路由处理程序,具体取决于接下来声明的那个。但是路由处理程序中的next()仅调用下一个路由处理程序。如果接下来有中间件,则跳过它。因此,必须在所有路由处理程序之前声明中间件。
这里有一个例子来说明:
var express = require('express');var app = express();app.use(function frontcontrollermiddlewareexecuted(req, res, next){  console.log('(1) this frontcontrollermiddlewareexecuted is executed');  next();});app.all('*', function(req, res, next){  console.log('(2) route middleware for all method and path pattern *, executed first and can do stuff before going next');  next();});app.all('/hello', function(req, res, next){  console.log('(3) route middleware for all method and path pattern /hello, executed second and can do stuff before going next');  next();});app.use(function frontcontrollermiddlewarenotexecuted(req, res, next){  console.log('(4) this frontcontrollermiddlewarenotexecuted is not executed');  next();});app.get('/hello', function(req, res){  console.log('(5) route middleware for method get and path patter /hello, executed last and i do my stuff sending response');  res.send('hello world');});app.listen(80);
现在我们看到了app.use()方法的唯一性以及它用于声明中间件的原因。
让我们重写我们的示例站点代码:var app = require(express)();function checklogin(){    return false;}function logrequest(){    console.log(new request);}app.use(function(req, res, next){    logrequest();    next();})app.use(function(req, res, next){    if(checklogin()){        next();    }    else{        res.send(you are not logged in!!!);    }})app.get(/dashboard, function(req, res, next){    res.send(this is the dashboard page);});app.get(/profile, function(req, res, next){    res.send(this is the dashboard page);});app.listen(8080);
本篇文章到这里就已经全部结束了,更多其他精彩内容可以关注的javascript视频教程栏目!
以上就是express.js中间件的介绍(附示例)的详细内容。
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product