所以我看到了TJ's guide to creating modular Express-apps , 跟着效果不错,但是想知道详细的工作原理,一搜也没有答案。
简而言之,我想知道:在 Express 中安装应用程序时,应用程序的哪些部分是共享的,哪些部分不是?
一些例子来澄清我的问题:
应用程序.js:
app.use(express.bodyParser());
app.use(loginApi); //loginApi is an express app
app.listen(3000);
这个例子有效。但是,如果我将 app.use(loginApi)
放在 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 的其余路由呢?他们会受到影响吗?如果我添加另一个模块,它会受到影响吗?
最佳答案
if I place the app.use(loginApi) before app.use(express.bodyParser()); , the body parser will not be available in the loginApi subapp. Why is that?
这是因为 Express 处理请求的方式。任何传入请求都从中间件堆栈的顶部开始,以 app.use()
堆栈开始。
中间件只是具有函数签名 function(req, res, next)
的函数,如果他们想将请求传递给后续的,则调用 next()
函数,或自己发送响应。您定义了一组这些函数的“中间件链”(许多函数由 express 提供,例如 express.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
。然后该函数调用其内部的 next()
,将其传递给中间件链中的下一个函数 (app.use(loginApi)
)。 loginApi 应用程序有自己的中间件链,但请求已经从外部应用程序设置了 req.body
。如果 loginApi 没有发送响应,请求将继续发送到 app.use(app.router)
,此时请求将转到您在外部应用程序中设置的路由功能。
所以答案是:安装的应用程序将共享中间件功能,这些功能位于 app.use(loginApi)
关于node.js - 如何在 Express 中安装应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19306084/