在 Node.js 上运行的 Express.jsapp.all("*", … )
和Express.js之间有什么有用的区别吗?app.use("/", … )
7 回答
在大多数情况下,它们会等效地工作。最大的区别是应用中间件的顺序:
app.all()
附加到应用程序的路由器,因此只要到达app.router
中间件(处理所有方法路由......GET
,POST
等),就会使用它。
注意:
app.router
已在 express 4.x 中弃用
app.use()
附加到应用程序的主中间件堆栈,所以它按照中间件指定的顺序使用,例如,如果你把它放在第一位,它将是第一个运行的东西。如果你把它放在最后,(在路由器之后),它通常根本不会运行。
通常,如果您想对所有路由进行全局处理,这app.use()
是更好的选择。此外,它未来出现错误的可能性较小,因为 express 0.4 可能会删除隐式路由器(这意味着路由器在中间件中的位置将比现在更重要,因为从技术上讲,您甚至不必使用它现在)。
app.use只接受一个回调函数,它是为中间件设计的。中间件通常不处理请求和响应,(技术上他们可以)它们只是处理输入数据,并将其交给队列中的下一个处理程序。
app.use([path], function)
app.all接受多个回调,用于路由。通过多个回调,您可以过滤请求并发送响应。它在 express.js 上的过滤器中进行了解释
app.all(path, [callback...], callback)
app.use只查看 url 是否以指定路径开头
app.use( "/product" , mymiddleware);
// will match /product
// will match /product/cool
// will match /product/foo
app.all将匹配完整路径
app.all( "/product" , handler);
// will match /product
// won't match /product/cool <-- important
// won't match /product/foo <-- important
app.all( "/product/*" , handler);
// won't match /product <-- Important
// will match /product/
// will match /product/cool
// will match /product/foo
应用程序使用:
- 将中间件注入到您的前端控制器配置中,例如:标头、cookie、会话等。
- 必须写在 app[http_method] 之前,否则不会执行。
- 几个调用按写的顺序处理
惊恐:
- (like app[http_method]) 用于配置路由的控制器
- “all”表示它适用于所有 http 方法。
- 几个调用按写的顺序处理
看看这个 expressJs 代码示例:
var express = require('express');
var app = express();
app.use(function frontControllerMiddlewareExecuted(req, res, next){
console.log('(1) this frontControllerMiddlewareExecuted is executed');
next();
});
app.all('*', function(req, res, next){
console.log('(2) route middleware for all method and path pattern "*", executed first and can do stuff before going next');
next();
});
app.all('/hello', function(req, res, next){
console.log('(3) route middleware for all method and path pattern "/hello", executed second and can do stuff before going next');
next();
});
app.use(function frontControllerMiddlewareNotExecuted(req, res, next){
console.log('(4) this frontControllerMiddlewareNotExecuted is not executed');
next();
});
app.get('/hello', function(req, res){
console.log('(5) route middleware for method GET and path patter "/hello", executed last and I do my stuff sending response');
res.send('Hello World');
});
app.listen(80);
这是访问路由'/hello'时的日志:
(1) this frontControllerMiddlewareExecuted is executed
(2) route middleware for all method and path pattern "*", executed first and can do stuff before going next
(3) route middleware for all method and path pattern "/hello", executed second and can do stuff before going next
(5) route middleware for method GET and path patter "/hello", executed last and I do my stuff sending response
使用app.use()
,“挂载”路径被剥离并且对中间件函数不可见:
app.use('/static', express.static(__dirname + '/public'));
express.static
除非req.url
包含 this 前缀 ( /static
),否则不会调用挂载的中间件函数 ( ),此时调用函数时会剥离它。
有了app.all()
,就没有这种行为。
以上所有答案均未提及两个差异。
第一个:
app.all
接受正则表达式作为其路径参数。app.use
不接受正则表达式。
第二个:
app.all(path, handler)
or app[method](path, handler)
handlers'path
必须与all path
相同。也就是说,app[method]
路径是完整的。
app.use(path, handler)
,如果use
的路径完整,则处理程序的路径必须是/
。如果use
的路径是完整路径的开始,则处理程序路径必须是完整路径的其余部分。
app.use("/users", users);
//users.js: the handler will be called when matchs `/user/` path
router.get("/", function (req, res, next) {
res.send("respond with a resource");
});
// others.js: the handler will be called when matches `/users/users` path
router.get("/users", function (req, res, next) {
res.send("respond with a resource");
});
app.all("/users", users);
//others.js: the handler will be called when matches `/`path
router.get("/", function (req, res, next) {
res.send("respond with a resource");
});
//users.js: the handler will be called when matches `/users` path
router.get("/users", function (req, res, next) {
res.send("respond with a resource");
});
有两个主要区别:
1. 模式匹配(Palani 给出的答案)
2.next(route)
在使用app.use
. 这在文档的链接中有所说明:
NOTE: next('route') will work only in middleware functions that were loaded by using the app.METHOD() or router.METHOD() functions.
链接:http ://expressjs.com/en/guide/using-middleware.html
的工作效果next('route')
可以从下面的例子中看出:
app.get('/',
(req,res,next)=>{console.log("1");
next(route); //The code here skips ALL the following middlewares
}
(req,res,next)=>{next();}, //skipped
(req,res,next)=>{next();} //skipped
);
//Not skipped
app.get('/',function(req,res,next){console.log("2");next();});