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

标签 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);

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

示例路由.js

router.get('/', function(req, res){
    ....
});

example2Routes.js

router.post('/create', function(req, res){
    ....
});

最佳答案

Does express app.use execute every time a path is heard on server.js

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

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

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

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

请注意,最后一个参数下一个。当中间件函数被调用时,它的工作方式有三个主要选择:

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

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

如果其中一个中间件处理程序不调用 next(),那么对于该请求,链中位于其之后的任何处理程序都不会被该请求调用。

<小时/>

另外,您可以将中间件限制为仅某些 url 路径。而不是调用

app.use(example1)

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

app.use('/api', example1);

然后,只有以 /api 开头的路径才会调用此中间件。

或者,您可以类似地使用路由器来创建中间件分支。例如,如果您有一些只想为以 /api 开头的请求调用的中间件处理程序,那么您可以为 URL 上的 /api 前缀创建一个路由器,并将中间件处理程序附加到该路由器而不是应用程序对象,然后该路由器上的中间件处理程序将只为以 /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);

关于javascript - 每次在 server.js 上听到路径时都会执行express app.use,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41862923/

相关文章:

javascript - 表的 Firebase child_changed

javascript - Google Map API 需要更深的缩放

python - 哪些因素导致数据无法在 python(或 python/node.js)的套接字中通过?

javascript - 何时关闭 MongoDB 连接

javascript - getElementsByTagName 在 Chrome 扩展程序中不起作用

javascript - Node 语法错误 : Invalid or unexpected

angularjs - Mongoose 架构中具有默认值的属性不会持久存在

node.js - 像nock这样的nodejs模拟模块有什么好处?

node.js - multer 不允许使用默认图像的问题

javascript - Express & Jade,向布局添加代码的模板