Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 如何在Express中装载应用程序_Node.js_Express - Fatal编程技术网

Node.js 如何在Express中装载应用程序

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

所以我已经看到了,跟随它到了很好的效果,但是我想知道更多关于它如何工作的细节,但是搜索没有给我答案

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

以下是一些澄清我问题的例子:

app.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();
});
app.js

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

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


如果您在
use()
之前使用
use()
ing
bodyParser
,则整个子应用程序将在
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”的所有路径,这些路径不会被早期路径捕获。