express.js 中 app.use 和 app.get 的区别

新手上路,请多包涵

我对express和node.js有点陌生,我无法弄清楚app.use和app.get之间的区别。看来您可以同时使用它们来发送信息。例如:

 app.use('/',function(req, res,next) {
    res.send('Hello');
    next();
});

似乎与此相同:

 app.get('/', function (req,res) {
   res.send('Hello');
});

原文由 Andre Vorobyov 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 997
2 个回答

app.use() 用于将 中间件 绑定到您的应用程序。 path 是“ _挂载_”或“ _前缀_”路径,并将中间件限制为仅适用于请求以它 开头 的任何路径。它甚至可以用来嵌入另一个应用程序:

 // subapp.js
var express = require('express');
var app = modules.exports = express();
// ...

 // server.js
var express = require('express');
var app = express();

app.use('/subapp', require('./subapp'));

// ...

通过将 / 指定为“ _挂载_”路径, app.use() 将响应以 / 开头的任何路径,所有这些路径都被使用并且与 HTTP 动词无关:

  • GET /
  • PUT /foo
  • POST /foo/bar
  • 等等

另一方面, app.get() 是 Express 应用程序路由 的一部分,用于在使用 GET HTTP 动词请求时匹配和处理特定路由:

  • GET /

而且,您的 app.use() 示例的等效路由实际上是:

 app.all(/^\/.*/, function (req, res) {
    res.send('Hello');
});


更新:试图更好地展示差异。

路由方法,包括 app.get() ,是帮助您更精确地对齐对请求的响应的便捷方法。他们还添加了对 参数next('route') 等功能的支持。

在每个 app.get() 中调用 app.use() ,因此您当然可以直接使用 app.use() 完成所有这些操作。但是,这样做通常需要(可能不必要地)重新实现不同数量的样板代码。

例子:

  • 对于简单的静态路由:
   app.get('/', function (req, res) {
    // ...
  });

对比

  app.use('/', function (req, res, next) {
    if (req.method !== 'GET' || req.url !== '/')
      return next();

    // ...
  });

  • 对同一路线使用多个处理程序:
   app.get('/', authorize('ADMIN'), function (req, res) {
    // ...
  });

对比

  const authorizeAdmin = authorize('ADMIN');

  app.use('/', function (req, res, next) {
    if (req.method !== 'GET' || req.url !== '/')
      return next();

    authorizeAdmin(req, res, function (err) {
      if (err) return next(err);

      // ...
    });
  });

  • 带参数:
   app.get('/item/:id', function (req, res) {
    let id = req.params.id;
    // ...
  });

对比

  const pathToRegExp = require('path-to-regexp');

  function prepareParams(matches, pathKeys, previousParams) {
    var params = previousParams || {};

    // TODO: support repeating keys...
    matches.slice(1).forEach(function (segment, index) {
      let { name } = pathKeys[index];
      params[name] = segment;
    });

    return params;
  }

  const itemIdKeys = [];
  const itemIdPattern = pathToRegExp('/item/:id', itemIdKeys);

  app.use('/', function (req, res, next) {
    if (req.method !== 'GET') return next();

    var urlMatch = itemIdPattern.exec(req.url);
    if (!urlMatch) return next();

    if (itemIdKeys && itemIdKeys.length)
      req.params = prepareParams(urlMatch, itemIdKeys, req.params);

    let id = req.params.id;
    // ...
  });

注意:Express 对这些功能的实现包含在其 RouterLayerRoute 中。

原文由 Jonathan Lonowski 发布,翻译遵循 CC BY-SA 4.0 许可协议

简单的 app.use 意味着“在所有请求上运行”

app.get 表示“针对给定的 URL 在 GET 请求上运行”

原文由 Dhyan Mohandas 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题