3

所以我看过TJ 的创建模块化 Express-apps 的指南,效果很好,但想了解更多关于它如何工作的细节,但是搜索没有给我答案。

简而言之,我想知道: 在 Express 中安装应用程序时,应用程序的哪些部分是共享的,哪些部分不是?

一些例子来澄清我的问题:

应用程序.js:

app.use(express.bodyParser()); 

app.use(loginApi); //loginApi is an express app 

app.listen(3000);

这个例子有效。但是,如果我放置app.use(loginApi)before app.use(express.bodyParser());,主体解析器将在 loginApi 子应用中不可用。这是为什么?

另一个例子:

子模块.js

var app = module.exports = require('express')();
app.all('*', function(req, res, next){
    console.log('nifty middleware');
        next();
});

应用程序.js

app.get('/funtimes', fn);
app.use(submodule); 
app.listen(3000);

现在在这个例子中,如果我理解正确的话,/funtimes路由不会受到所有路由的子模块中间件的影响。但是 app.js 的其余路由呢?他们会受到影响吗?如果我添加另一个模块,它会受到影响吗?

4

3 回答 3

4

如果我将 app.use(loginApi) 放在 app.use(express.bodyParser()) 之前;,正文解析器在 loginApi 子应用中将不可用。这是为什么?

这是因为 Express 处理请求的方式。任何传入的请求都从中间件堆栈的顶部开始,从app.use()堆栈开始。

中间件只是具有函数签名的函数,如果它们想要将请求移交给后续函数,则它们function(req, res, next)要么调用,要么自己发送响应。next()您定义了一堆这些函数的“中间件链”(许多由 express 提供,likeexpress.logger()express.compress().)

所以在以下场景中:

app.use(express.bodyParser());
var loginApi = require('./api/index.js')
app.use(loginApi);
app.use(app.router);

然后一个传入的请求将首先命中app.use(express.bodyParser()),解析req.body。然后该函数调用其 internal next(),将其传递给中间件链 ( app.use(loginApi)) 中的下一个函数。loginApi 应用程序有自己的中间件链,但请求已经req.body从外部应用程序设置。如果 loginApi 没有发送响应,请求将继续app.use(app.router),此时请求将转到您在外部应用程序中设置的路由功能。

所以答案是:一个挂载的应用程序将共享中间件功能,这些中间件功能放在该行之前app.use(loginApi)

于 2013-10-10T21:01:02.423 回答
3

中间件按顺序运行(直到其中一个中间件不调用next())。

如果您在inguse()之前安装了应用程序,则整个子应用程序将在添加其属性之前运行。use()bodyParserbodyParser

于 2013-10-10T20:58:53.350 回答
2

你问的是中间件。这让我困惑了一段时间。中间件是为了接收请求并返回响应而运行的函数。app.use() 将函数作为其唯一参数。该函数以一致的方式处理请求。

app.use 很像 app.all("*")。

顺序很重要。例如,您可能希望在提供响应之前运行验证器。

我最近学到的一件事是,您可以将一组中间件函数传递给路由。例如

app.get("/whatever",[
    function(req,res,next}{
        ...validation...
        next();
    },
    function(req,res) {
        ...actions....
        res.send(200);
    }

]);

next 回调告诉 express 在中间件中运行下一个函数。中间件也可以修改请求对象。这在身份验证中被大量使用。例如,您会看到 req.user 是从数据库中定义的,因此在以后的中间件中您将能够引用用户的属性。但是,它也可以用于大量其他东西。

于 2013-10-10T21:00:18.593 回答