我看到的几乎每个Express应用程序都有一个app.use语句用于中间件,但我还没有找到一个清晰、简洁的解释来说明中间件到底是什么以及app.use语句在做什么。甚至express文档本身在这一点上也有点模糊。你能给我解释一下这些概念吗?
当前回答
中间件是在输入/源产生输出后在中间执行的函数,该输出可以是最终输出,也可以被下一个中间件使用,直到循环完成。
它就像一个经过流水线的产品,在移动过程中不断修改,直到完成、评估或被拒绝。
中间件期望处理某些值(即参数值),并且基于某些逻辑,中间件将调用或不调用下一个中间件,或将响应发送回客户端。
如果您仍然不能理解中间件的概念,那么它在某种程度上类似于Decorator或命令链模式。
其他回答
我添加了一个后期的答案,添加一些在之前的答案中没有提到的东西。
现在应该很清楚了,中间件是在客户端请求和服务器应答之间运行的函数。最常见的中间件功能是错误管理、数据库交互、从静态文件或其他资源获取信息。要在中间件堆栈上移动,必须调用下一个回调,您可以在中间件函数的末尾看到它移动到流程中的下一个步骤。
你可以使用app.use方法,得到这样的流程:
var express = require('express'),
app = express.createServer(),
port = 1337;
function middleHandler(req, res, next) {
console.log("execute middle ware");
next();
}
app.use(function (req, res, next) {
console.log("first middle ware");
next();
});
app.use(function (req, res, next) {
console.log("second middle ware");
next();
});
app.get('/', middleHandler, function (req, res) {
console.log("end middleware function");
res.send("page render finished");
});
app.listen(port);
console.log('start server');
但是您也可以使用另一种方法,将每个中间件作为函数参数传递。下面是一个来自MooTools Nodejs网站的例子,中间件在响应被发送回客户端之前获得Twitter、Github和Blog的流。注意这些函数是如何在app.get('/', githubEvents, twitter, getLatestBlog, function(req, res){中作为参数传递的。使用app.get只会在GET请求中被调用,app.use会在所有请求中被调用。
// github, twitter & blog feeds
var githubEvents = require('./middleware/githubEvents')({
org: 'mootools'
});
var twitter = require('./middleware/twitter')();
var blogData = require('./blog/data');
function getLatestBlog(req, res, next){
blogData.get(function(err, blog) {
if (err) next(err);
res.locals.lastBlogPost = blog.posts[0];
next();
});
}
// home
app.get('/', githubEvents, twitter, getLatestBlog, function(req, res){
res.render('index', {
title: 'MooTools',
site: 'mootools',
lastBlogPost: res.locals.lastBlogPost,
tweetFeed: res.locals.twitter
});
});
在非常基本的术语中,如果我想这样解释它,我是从traversymedia youtube频道express速成课程中学到的。 中间件是一个函数,它在你像这样调用路由之后执行。
var logger = function(req, res, next){
console.log('logging...');
next();
}
app.use(logger);
这个记录器函数在你每次刷新页面时执行这意味着你可以在页面呈现后写任何你需要做的事情任何api调用,重置基本上任何事情。把这个中间件放在你的路由功能之前,中间件的顺序非常重要,否则它就无法工作
中间件是在输入/源产生输出后在中间执行的函数,该输出可以是最终输出,也可以被下一个中间件使用,直到循环完成。
它就像一个经过流水线的产品,在移动过程中不断修改,直到完成、评估或被拒绝。
中间件期望处理某些值(即参数值),并且基于某些逻辑,中间件将调用或不调用下一个中间件,或将响应发送回客户端。
如果您仍然不能理解中间件的概念,那么它在某种程度上类似于Decorator或命令链模式。
经过简化之后,web服务器可以被看作是一个接收请求并输出响应的函数。因此,如果您将web服务器视为一个功能,您可以将其组织成几个部分,并将它们分离为更小的功能,以便它们的组合将是原始功能。
中间件是可以与其他函数组合的较小函数,其明显的好处是可以重用它们。
Middleware is a subset of chained functions called by the Express js routing layer before the user-defined handler is invoked. Middleware functions have full access to the request and response objects and can modify either of them. The middleware chain is always called in the exact order in which it has been defined, so it is vital for you to know exactly what a specific piece of middleware is doing. Once a middleware function finishes, it calls the next function in the chain by invoking its next argument as function. After the complete chain gets executed,the user request handler is called.
推荐文章
- ReferenceError: description没有定义NodeJs
- 将一个二进制的NodeJS Buffer转换为JavaScript的ArrayBuffer
- AngularJS只适用于单页应用程序吗?
- 如何在vue-cli项目中更改端口号
- 同步和异步编程(在node.js中)的区别是什么?
- 如何编辑通过npm安装的节点模块?
- “node_modules”文件夹应该包含在git存储库中吗
- 使用package.json在全局和本地安装依赖项
- this.libOptions.parse不是一个函数
- 对嵌套文件夹运行npm install的最好方法是什么?
- 节点Multer异常字段
- 很好的初学者教程socket.io?
- CALL_AND_RETRY_LAST分配失败-进程内存不足
- 在Ubuntu上安装Node.js
- 使用express.js代理