每次在server.js上听到路径时都会执行express app.use

hen*_*hen 0 javascript node.js express

在我的server.js文件中,我可能有许多代码行使用app.use,app.use每次命中路径时都会执行这些行吗?使用快速路由器时,我对这是如何工作有点困惑.如果我有类似的东西

var example1 = require('./js/exampleRoutes.js)
var example2 = require('./js/example2Routes.js)

app.use(express.static(process.cwd() + '/public'));
app.use(bodyParser.urlencoded({ extended: false }));
app.use(methodOverride("_method"));

app.use(example1, example2);

app.listen(PORT);
Run Code Online (Sandbox Code Playgroud)

每次命中路径时都会执行app.use的所有四行,并且根据路径命中,它会将程序重定向到example1路由或example2路由吗?

exampleRoutes.js

router.get('/', function(req, res){
    ....
});
Run Code Online (Sandbox Code Playgroud)

example2Routes.js

router.post('/create', function(req, res){
    ....
});
Run Code Online (Sandbox Code Playgroud)

jfr*_*d00 7

每次在server.js上听到路径时都会执行express app.use

这取决于您是否在任何app.use()语句中使用路径,这取决于所有app.use()语句是否将控制权传递给下一个处理程序,或者是否其中一些语句故意终止链并自行处理最终响应.

所有app.use()语句都被注册为中间件处理程序,用于命中该app对象的所有请求.如果它上面有一个特定的路径,那么只有在匹配该路径时才会调用它.如果它没有路径(如在您的示例中),则将考虑每个请求.

当调用给定的中间件处理程序时,它将从Express文档中传递三个参数,如本示例所示:

app.use(function (req, res, next) {
  console.log('Time: %d', Date.now());
  next();
});
Run Code Online (Sandbox Code Playgroud)

注意,最后一个参数next.当一个中间件函数被调用时,它有三个主要的选择:它是如何工作的:

  1. 它可以做一些事情,然后让请求继续给其他处理程序.
  2. 它可以执行某些操作然后触发错误(例如,身份验证失败或缺少必需的会话cookie).
  3. 它可以做一些事情,然后发送最终的响应(res.send(xxxx)),而不是将控制传递给其他处理程序.

将控制权传递给其他处理程序的机制是在完成处理后调用next(),并准备好让其他处理程序在此请求时获得破解.如果每个中间件处理程序调用next()它们看到的每个请求,那么将为每个请求调用所有app.use()处理程序.在上面的Express文档示例中,您可以看到这是一个非常简单的中间件处理程序.它只是记录请求的时间,然后调用next()将控制权传递给链中的下一个处理程序.

如果其中一个中间件处理程序没有调用next(),那么对于该请求,链中的所有处理程序都不会被调用该请求.


另外,您可以将中间件限制为仅限于某些URL路径.而不是打电话

app.use(example1)
Run Code Online (Sandbox Code Playgroud)

您可以将路径包含为参数,例如:

app.use('/api', example1);
Run Code Online (Sandbox Code Playgroud)

然后,只会为以中开头的路径调用此中间件/api.

或者,您可以类似地使用路由器来创建中间件分支.例如,如果您有一些中间件处理程序,您只想为以开头的请求调用/api,那么您可以为/apiURL上的前缀创建路由器,并将中间件处理程序附加到该路由器而不是应用程序对象,然后该路由器上的中间件处理程序仅/api针对以该路由器开头并因此指向该路由器的请求进行调用.

// create api router
var router = express.Router();

// register middleware that is called only when requests go through this router
router.use(example1);

// register normal get handler
router.get('/whatever', function(req, res) {...});

// hook api router into the app
app.use('/api', router);
Run Code Online (Sandbox Code Playgroud)