Express.js 中的中间件概念简单有趣的介绍
如果你已经在 Node.js 周围呆了足够长的时间,你可能已经听说过中间件,我不会撒谎,当我第一次遇到 WORD ITSELF 时我很困惑所以更不用说中间件的实现了,但是你’必须动手学习所以请允许我轻轻地教你关于中间件需要了解的知识 尽可能简单
建立我们的开发环境
如果您使用的是 Linux 或 Mac,请打开您的终端,如果您使用的是 Windows,请打开命令提示符
mkdir 中间件 && cd 中间件创建一个新目录并导航到它
npm init –y 使用默认设置初始化一个新的 npm 项目(稍后你可以使用 package.json,我将向你展示)
npm i express && npm i –save-dev nodemon 这将首先安装 express,因为我们需要它来构建我们的后端,然后我们将安装 nodemon 并将其保存为 dev 依赖项,因为我们实际上并不需要它生产环境
向 package.json 添加脚本
如果你打开你的 package.json 文件,你会发现一个名为 scripts 的部分,这个部分包含在终端中运行命令的“快捷方式”,它非常有用,所以让我们添加一个小脚本来运行 nodemon,看起来就像我们在太酷了
“dev”: “nodemon index.js” 在“test”脚本之后添加这个
要触发这些脚本,我们只需在终端输入 npm run 后跟脚本部分中定义的脚本名称,因此在我们的例子中,我们输入 npm run dev 但让我们稍后再使用它:)
无论如何,什么是中间件
中间件基本上是在路由处理函数之前执行的函数……。 ik 这不是那么简单所以让我们来看看一个非常基本的快递服务器
const express = require(“express”);const app = express();app.get(“”, (req, res) => res.send(“you’ve reached the home page”));app.get(“/users”, (req, res) => res.send(“this is the users page”));app.get(“/articles”, (req, res) => res.send(“this is the articles page”));app.get(“*”, (req, res) => res.status(404).send(“Page not found”));app.listen(3000, () => console.log(“up and running”));
好的,那里没有什么太花哨的吧?我们有三个路由 / , /users , /articles 并且我们为这些路由中的每一个都有路由处理函数
运行 npm run dev ,您应该会看到“启动并运行”的小消息
我们的中间件将在对这些路由的每个请求之前或在特定路由之前执行,因为我们可以选择指定
中间件基本上是一个可以访问请求和响应对象的功能,就像路由处理程序一样,它可以用来记录对我们服务器的每个请求或检查用户是否登录,验证和授权用户保护某些资源和许多其他目的
中间件 VS。路由处理程序
中间件和路由处理程序的最大区别是 next() 函数
next() 函数是中间件的第三个参数,它基本上告诉后端“继续下一个中间件”,或者换句话说“给它绿灯继续下一个例程”,所以我们的页面不只是冻结并且永远不会完成加载,因此如果我们忘记放置它,程序将无法继续,因为它卡在中间件中
中间件的类型
如上所述,我们有两种类型的中间件,一种在应用程序的顶层运行,因此它像中间件一样应用于所有路由处理程序,以检查用户是否登录,我们可以将其应用于所有帖子路由我们正在编写的一些社交媒体应用程序
默认 express 中间件的示例是 express.json() 中间件,我们一直在顶部使用它来启用接受和解析 json
另一种类型是在特定路由之前运行的中间件,也许您需要保护某些可以访问仅管理员文章或某些 VIP 内容访问权限的应用程序的路由
编写我们的第一个中间件
说了这么多,让我们看看如何编写我们自己的中间件,它会给我们一个美味的饼干
在我们的导入之后添加这个代码片段
const say_hi = (req, res, next) => { console.log(“have a yummy cookie “); next();}
为了在应用级别“启用”中间件,我们使用 express.use(say_hi); 并注意我们没有添加括号,因为我们没有调用函数
现在前往任何路线并检查您的终端是否有
你的 index.js 现在应该是这样的
const express = require(“express”); const app = express(); const say_hi = (req, res, next) => { console.log(“have a yummy cookie “); next();};app.use(say_hi); app.get(“”, (req, res) => res.send(“you’ve reached the home page”)); app.get(“/users”, (req, res) => res.send(“this is the users page”)); app.get(“/articles”, (req, res) => res.send(“this is the articles page”)); app.get(“*”, (req, res) => res.status(404).send(“Page not found”)); app.listen(3000, () => console.log(“up and running”));
为特定路线编写中间件
现在我们已经了解了如何编写一个在应用程序级别运行的中间件,也就是在每条路由之前运行,让我们再编写两个中间件,一个在用户路由之前运行,告诉我们“我爱我的用户”,另一个用于文章 上面写着“哇,看看所有这些文章”所以leggoooooo
const users_middleware = (req, res, next) => { console.log(“i love my users “); next();};const articles_middleware = (req, res, next) => { console.log(“wow look at all those articles “);};
现在,为了让我们专门为我们的路由使用这些路由,我们需要分别将每个路由作为路由处理函数的参数传递,所以它现在看起来像这样
const express = require(“express”);const app = express();const say_hi = (req, res, next) => { console.log(“have a yummy cookie “); next();};app.use(say_hi);const users_middleware = (req, res, next) => { console.log(“i love my users “); next();};const articles_middleware = (req, res, next) => { console.log(“wow look at all those articles “); next();};app.get(“”, (req, res) => res.send(“you’ve reached the home page”));app.get(“/users”, users_middleware, (req, res) => res.send(“this is the users page”));app.get(“/articles”, articles_middleware, (req, res) => res.send(“this is the articles page”));app.get(“*”, (req, res) => res.status(404).send(“Page not found”));app.listen(3000, () => console.log(“up and running”));
速记
- 中间件只是一个函数,在服务器接收到请求之后,在路由句柄响应之前执行
- 他们可以访问三个参数,req res 和第三个参数,这是一个方便地调用 next() 以允许下一个中间件运行的函数
- 它们可以在应用程序级别,因此它们在对每个端点的每个请求之前运行,或者可以指定到某个路由
结论
中间件一开始对于那些刚开始表达的人来说可能是一个复杂的概念,但是一旦你发现它们的真正需求,它们就很容易实现,它们是一个强大的工具来调节你的服务器资源和访问控制 许多其他需求,因为您了解它们背后的基本思想
非常感谢你能做到这一点我感谢你的时间和对我博客的兴趣,我希望你喜欢你的白天/黑夜
关注七爪网,获取更多APP/小程序/网站源码资源!