node.js - 如何在 Express 中安装应用程序

标签 node.js express

所以我看到了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/

相关文章:

javascript - 使用 mocha 和 sinon 测试异步函数

javascript - Nodejs : make a GET request with users parameters

node.js - 在山魈中发送图像

javascript - 使用 Node.JS Mongoose 查找文档并将值插入到 MongoDB 中的数组中

javascript - 继承关联 N :M

javascript - FIREBASE admin sdk 不返回 promise ? Node JS

c++ - node.js 附加组件中未捕获异常

node.js - 如何从本地主机向我的 docker 容器发送 HTTP 请求?

node.js - 将 socket.io 置于反向代理后面?

javascript - 无法将我的 nodejs 应用程序与 mLab 数据库连接