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

本篇文章给大家带来的内容是关于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);

登录后复制

本篇文章到这里就已经全部结束了,更多其他精彩内容可以关注PHP中文网的JavaScript视频教程栏目!

以上就是express.js中间件的介绍(附示例)的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2732340.html

(0)
上一篇 2025年3月8日 00:42:11
下一篇 2025年3月1日 18:56:46

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • vue刷新404的问题解决方法

    本篇文章给大家带来的内容是关于vue刷新404的问题解决方法,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 1、 问题描述 利用vue-route结合webpack编写了一个单页路由项目,运维协助在服务器端配置nginx。…

    编程技术 2025年3月8日
    200
  • export和export default中的知识点介绍(附示例)

    本篇文章给大家带来的内容是关于export和export default中的知识点介绍(附示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 网上有很多关于export和export default的文章,他们大部门都是…

    2025年3月8日
    200
  • 如何从JavaScript到TypeScript?

    本篇文章给大家带来的内容是关于如何从JavaScript到TypeScript?有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 想学习typeScript,我觉得你首先要对原生javaScript非常熟练,最基础的知识最重要…

    编程技术 2025年3月8日
    200
  • npm和yarn安装node-sass的问题解决方法介绍

    本篇文章给大家带来的内容是关于npm和yarn安装node-sass的问题解决方法介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 node-sass npm 安装 node-sass 依赖时,会从 github.com…

    编程技术 2025年3月8日
    200
  • 如何在MacOS上安装node.js和npm

    本篇文章将介绍关于使用homebrew包管理器在macos操作系统上安装node.js和npm。 Node.js是一个开源的,跨平台的JavaScript运行平台,它使用于服务器端脚本的JavaScript能够在发送到客户端的Web浏览器之…

    2025年3月8日
    200
  • 如何使用Node.js读取JSON文件

    本篇文章将介绍关于使用node.js读取json文件内容,使用的是jsonfile模块的readfile和readfilesync函数。 要求:要在系统上安装node.js和npm。 对于本篇文章,我们使用的是JSonfile NPM模块。…

    2025年3月8日
    200
  • nodejs模块的简单理解(附示例)

    本篇文章给大家带来的内容是关于nodejs模块的简单理解(附示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 这个小短文用于快速理解 nodejs 模块(也就是 CommonJS 规范)。 本质 module.expo…

    编程技术 2025年3月8日
    200
  • NPM机制深入理解

    本篇文章给大家带来的内容是关于NPM机制深入理解,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 使用NPM安装的时候会经常出现包冲突(比如多个主模块的子模块版本不一致等),导致在开发过程中会遇到各种或大或小的问题。所有在这…

    编程技术 2025年3月8日
    200
  • Express中间件body-parser的实现方法

    本篇文章给大家带来的内容是关于Express中间件body-parser的实现方法,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 之前文章写了怎么用body-parser中间件处理post请求,今天就大概实现下body-p…

    编程技术 2025年3月8日
    200
  • 如何使用nodejs分离html文件里的js和css(代码示例)

    本篇文章给大家带来的内容是关于如何使用nodejs分离html文件里的js和css(代码示例) ,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 摘要: 本文要实现的内容,使用nodejs 对文件的增删改查,演示的例子-》分…

    2025年3月8日
    200

发表回复

登录后才能评论