133

在 Node.js 上运行的 Express.jsapp.all("*", … )和Express.js之间有什么有用的区别吗?app.use("/", … )

4

7 回答 7

126

在大多数情况下,它们会等效地工作。最大的区别是应用中间件的顺序:

  • app.all()附加到应用程序的路由器,因此只要到达app.router中间件(处理所有方法路由...... GETPOST等),就会使用它。

注意:app.router已在 express 4.x 中弃用

  • app.use()附加到应用程序的主中间件堆栈,所以它按照中间件指定的顺序使用,例如,如果你把它放在第一位,它将是第一个运行的东西。如果你把它放在最后,(在路由器之后),它通常根本不会运行。

通常,如果您想对所有路由进行全局处理,这app.use()是更好的选择。此外,它未来出现错误的可能性较小,因为 express 0.4 可能会删除隐式路由器(这意味着路由器在中间件中的位置将比现在更重要,因为从技术上讲,您甚至不必使用它现在)。

于 2013-01-02T17:06:37.960 回答
102

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
于 2014-06-12T19:04:54.470 回答
21
  • 应用程序使用:

    1. 将中间件注入到您的前端控制器配置中,例如:标头、cookie、会话等。
    2. 必须写在 app[http_method] 之前,否则不会执行。
    3. 几个调用按写的顺序处理
  • 惊恐:

    1. (like app[http_method]) 用于配置路由的控制器
    2. “all”表示它适用于所有 http 方法。
    3. 几个调用按写的顺序处理

看看这个 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
于 2013-11-13T13:48:05.547 回答
13

使用app.use(),“挂载”路径被剥离并且对中间件函数不可见:

app.use('/static', express.static(__dirname + '/public'));

express.static除非req.url包含 this 前缀 ( /static),否则不会调用挂载的中间件函数 ( ),此时调用函数时会剥离它

有了app.all(),就没有这种行为。

于 2013-03-19T06:28:15.113 回答
5

是的,app.all()当使用任何类型的请求方法(POST、GET、PUT 或 DELETE)请求特定 URI 时调用

另一方面app.use(),用于您可能拥有的任何中间件,它安装在路径前缀上,并且在请求该路由下的 URI 时将被调用。

这是app.allapp.use的文档。

于 2013-01-02T17:06:42.657 回答
1

以上所有答案均未提及两个差异。

第一个:
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");
});
于 2018-12-23T11:12:29.250 回答
1

有两个主要区别:

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();});
于 2020-05-03T17:11:40.263 回答