小编典典

中间件和 app.use 在 Expressjs 中的实际含义是什么?

all

我看到的几乎每个 Express
应用程序都有一个app.use中间件声明,但我还没有找到一个清晰、简明的解释来说明中间件到底是什么以及该app.use声明的作用。甚至快递文档本身对此也有些含糊。你能为我解释一下这些概念吗?


阅读 102

收藏
2022-05-29

共1个答案

小编典典

中间件

我在一个新项目中分离中间件的概念已经进行了一半。

中间件允许您定义您应该通过的一系列操作。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,req& res)和一个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
})

用明确的术语来说,您只需为每个传入的 HTTP 请求定义一个您希望 express 处理的操作堆栈。

就快递(而不是连接)而言,您拥有全局中间件和特定于路由的中间件。这意味着您可以将中间件堆栈附加到每个传入的 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); 
});
2022-05-29