首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Expressjs中,中间件和app.use到底意味着什么?

在Expressjs中,中间件和app.use到底意味着什么?
EN

Stack Overflow用户
提问于 2011-09-08 00:48:43
回答 5查看 95K关注 0票数 240

我看到的几乎每个Express应用程序都有一个用于中间件的app.use语句,但我还没有找到一个清晰、简洁的解释,说明什么是中间件以及app.use语句在做什么。即使是快递文档本身在这一点上也有点模糊。你能给我解释一下这些概念吗?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-09-08 01:09:44

middleware

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

中间件允许您定义应该流经的操作堆栈。Express服务器本身就是一堆中间件。

代码语言:javascript
复制
// express
var app = express();
// middleware
var stack = middleware();

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

代码语言:javascript
复制
// express
app.use(express.static(..));
// middleware
stack.use(function(data, next) {
  next();
});

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

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

堆栈不会做任何事情,除非你处理它。Express将在每次在服务器上捕获传入的HTTP请求时处理堆栈。使用中间件,您可以手动处理堆栈。

代码语言:javascript
复制
// express, you need to do nothing
// middleware
stack.handle(someData);

一个更完整的例子:

代码语言:javascript
复制
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为每个传入的HTTP请求处理这些操作。

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

express &中间件的高级示例:

代码语言:javascript
复制
// 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); 
});
票数 115
EN

Stack Overflow用户

发布于 2011-09-08 01:41:33

简化后,web服务器可以看作是接收请求并输出响应的功能。因此,如果您将web服务器视为一个函数,您可以将其组织成几个部分,并将它们分成较小的函数,以便它们的组合将是原始函数。

中间件是较小的功能,您可以与其他功能组合,其明显的好处是您可以重用它们。

票数 63
EN

Stack Overflow用户

发布于 2016-02-24 18:13:53

中间件是在输入/源产生输出之后在中间执行的函数,该输出可能是最终输出,或者可以被下一个中间件使用,直到循环完成。

它就像一个流水线上的产品,在流水线上进行修改,直到完成、评估或被拒绝。

中间件期望某个值起作用(即参数值),并且基于某些逻辑,中间件将调用或不调用下一个中间件,或者将响应发送回客户端。

如果您还不能掌握中间件的概念,那么它在某种程度上类似于Decorator或Chain of command模式。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7337572

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档