Node.js 如何在Express中装载应用程序
所以我已经看到了,跟随它到了很好的效果,但是我想知道更多关于它如何工作的细节,但是搜索没有给我答案 简言之,我想知道:在Express中安装应用程序时,应用程序的哪些部分是共享的,哪些部分不是 以下是一些澄清我问题的例子: app.js:Node.js 如何在Express中装载应用程序,node.js,express,Node.js,Express,所以我已经看到了,跟随它到了很好的效果,但是我想知道更多关于它如何工作的细节,但是搜索没有给我答案 简言之,我想知道:在Express中安装应用程序时,应用程序的哪些部分是共享的,哪些部分不是 以下是一些澄清我问题的例子: app.js: app.use(express.bodyParser()); app.use(loginApi); //loginApi is an express app app.listen(3000); 这个例子很有效。但是如果我将app.use(loginA
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();
});
app.js
app.get('/funtimes', fn);
app.use(submodule);
app.listen(3000);
现在在这个例子中,如果我理解正确的话,/funtimes
路由不会受到所有路由的子模块中间件的影响。但是app.js的其他路线呢?他们会受到影响吗?如果我添加另一个模块,它会受到影响吗 中间件按顺序运行(直到其中一个中间件不调用next()
)
如果您在use()
之前使用use()
ingbodyParser
,则整个子应用程序将在bodyParser
添加其属性之前运行。您要问的是中间件。这让我困惑了一会儿。中间件是为了接收请求并返回响应而运行的功能。app.use()将函数作为其唯一参数。该函数以一致的方式处理请求
app.use很像app.all(“*”)
秩序很重要。例如,您可能希望在提供响应之前运行验证器
我最近学到的一件事是,可以将一组中间件函数传递给路由。比如说
app.get("/whatever",[
function(req,res,next}{
...validation...
next();
},
function(req,res) {
...actions....
res.send(200);
}
]))
下一个回调告诉express运行中间件中的下一个函数。中间件还可以修改请求对象。这在身份验证中被大量使用。例如,您将看到req.user正在从数据库中定义,因此在后面的中间件中,您将能够引用用户的属性。但是,它也可以用于其他很多东西
如果我将app.use(loginApi)放在app.use(express.bodyParser())之前,主体解析器在loginApi子应用中不可用。为什么呢
这是因为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)
,此时请求将转到您在外部应用程序中设置的路由功能
所以答案是:一个挂载的应用程序将共享中间件函数,这些函数放在应用程序行的前面。使用(loginApi)
顺便说一句,你甚至不需要数组,你可以将多个处理函数传递给应用程序。get('whatever',fn1,fn2,fn3)
这不是完全正确的。您可以使用app.use()在相对目录中“装载”子应用程序。例如,app.use(“/products”,productService)
将利用productService
中间件/应用程序来匹配“/products”的所有路径,这些路径不会被早期路径捕获。