几乎我看到的每个Express应用程序都有一个关于中间件的app.use条语句,但我还没有找到一个关于中间件到底是什么以及app.use条语句在做什么的清晰、简洁的解释.就连express 文件本身也有点含糊其辞.你能给我解释一下这些概念吗?

推荐答案

middleware

在一个新的项目中,我正在将中间件的概念分离一半.

中间件允许您定义一系列应该执行的操作.Express服务器本身就是一堆中间软件.

// express
var app = express();
// middleware
var stack = middleware();

然后可以通过调用.use向中间件堆栈添加层

// express
app.use(express.static(..));
// middleware
stack.use(function(data, next) {
  next();
});

中间件堆栈中的一层是一个函数,它接受n个参数(2个用于express,reqres)和一个next函数.

中间件希望层进行一些计算,增加参数,然后调用next.

除非你处理它,否则堆栈什么都做不了.每次服务器上捕获到传入的HTTP请求时,Express都会处理堆栈.使用中间件,您可以手动处理堆栈.

// express, you need to do nothing
// middleware
stack.handle(someData);

一个更完整的例子:

var middleware = require("../src/middleware.js");

var stack = middleware(function(data, next) {
    data.foo = data.data*2;
    next();
}, function(data, next) {
    setTimeout(function() {
        data.async = true;
        next();
    }, 100)
}, function(data) {
    console.log(data);
});

stack.handle({
    "data": 42
})

在express中,您只需定义一个操作堆栈,希望express for each 传入的HTTP请求处理这些操作.

在express(而不是connect)方面,您有全局中间件和路由特定中间件.这意味着您可以将中间件堆栈附加到每个传入的HTTP请求,或者仅将其附加到与特定路由交互的HTTP请求.

express&;中间件:

// middleware 

var stack = middleware(function(req, res, next) {
    users.getAll(function(err, users) {
        if (err) next(err);
        req.users = users;
        next();  
    });
}, function(req, res, next) {
    posts.getAll(function(err, posts) {
        if (err) next(err);
        req.posts = posts;
        next();
    })
}, function(req, res, next) {
    req.posts.forEach(function(post) {
        post.user = req.users[post.userId];
    });

    res.render("blog/posts", {
        "posts": req.posts
    });
});

var app = express.createServer();

app.get("/posts", function(req, res) {
   stack.handle(req, res); 
});

// express

var app = express.createServer();

app.get("/posts", [
    function(req, res, next) {
        users.getAll(function(err, users) {
            if (err) next(err);
            req.users = users;
            next();  
        });
    }, function(req, res, next) {
        posts.getAll(function(err, posts) {
            if (err) next(err);
            req.posts = posts;
            next();
        })
    }, function(req, res, next) {
        req.posts.forEach(function(post) {
            post.user = req.users[post.userId];
        });

        res.render("blog/posts", {
            "posts": req.posts
        });
    }
], function(req, res) {
   stack.handle(req, res); 
});

Node.js相关问答推荐

Azure虚拟机上的JS Express:可疑请求?

如何使用多个OR参数从多个集合聚合

TS 后端开发:prismagenerate找不到已安装的@tsed/prisma包

为什么 Cors 在 NodeJS 中不起作用

如何使用Stripe测试失败的收费?

Node.js中使用ffmpeg如何获取视频截图的位置?

Nodejs 从链接数组中获取数据并保存到 mongodb

Typescript typeRoots 未检测到类型定义

(Mongoose) 删除 TTL 字段失败

Express.js - 监听请求中止

JAVASCRIPT:foreach 循环后的空数组

无法通过谷歌Electron 表格 api( node js)中的服务帐户访问写入

Node.js、Cygwin 和 Socket.io 走进一家wine 吧……Node.js 抛出 ENOBUFS,所有人都死了

用于排除多个文件的 node.js glob 模式

从 CoffeeScript 中的数组中删除一个值

JSHint 是否支持异步/等待?

node.js(ES6 / Babel)中 import X 和 import * as X 的区别?

node.js 中存储的模块变量在什么范围内?

使用 Monit 而不是基本的 Upstart 设置有什么好处?

expressjs app.VERB 调用中的 next() 和 next('route') 有什么区别?