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)
每次在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.当一个中间件函数被调用时,它有三个主要的选择:它是如何工作的:
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)
| 归档时间: |
|
| 查看次数: |
582 次 |
| 最近记录: |