一尘不染

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

node.js

我是表示和node.js的新手,我不知道app.use和app.get之间的区别。似乎您可以同时使用它们来发送信息。例如:

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

似乎与此相同:

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

阅读 252

收藏
2020-07-07

共1个答案

一尘不染

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'));

// ...

通过指定/为“ mount ”路径,app.use()将响应以开头的所有路径,/并且所有路径均与使用的HTTP动词无关:

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

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

  • 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;
  // ...
});

注:快车实现这些功能都包含在它的RouterLayerRoute

2020-07-07