Подтвердить что ты не робот

Разница между app.use и app.get в express.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');
});
4b9b3361

Ответ 1

app.use() предназначен для привязки промежуточного программного обеспечения к вашему приложению. path представляет собой path "mount" или "prefix" и ограничивает промежуточное программное обеспечение только для всех запрошенных путей, начинающихся с него. Он может даже использоваться для встраивания другого приложения:

// 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 и предназначена для сопоставления и обработки определенного маршрута при запросе с помощью глагола HTTP GET:

  • 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 'реализация этих функций содержится в его Router, Layer и Route.

Ответ 2

app.use - это метод "нижнего уровня" от Connect, среда промежуточного программного обеспечения, от которой зависит Express.

Вот моя рекомендация:

  • Используйте app.get, если вы хотите открыть метод GET.
  • Используйте app.use, если вы хотите добавить некоторое промежуточное ПО (обработчик HTTP-запроса до того, как он поступит на маршруты, которые вы настроили в Express), или если вы хотите, чтобы ваши маршруты были модульными (например, выведите набор маршрутов из модуля npm, который могут использовать другие веб-приложения).

Ответ 3

Просто app.use означает "Запустить это во всех запросах"
app.get означает "Запустить это в запросе GET для данного URL"

Ответ 4

app.get вызывается, когда HTTP-метод установлен в GET, тогда как app.use вызывается независимо от метода HTTP и поэтому определяет слой который находится поверх всех других типов RESTful, с которыми экспресс-пакеты предоставляют вам доступ.

Ответ 5

Разница между app.use и app.get:

app.use → Обычно используется для внедрения промежуточного программного обеспечения в ваше приложение и может обрабатывать все типы HTTP-запросов.

app.get → Он предназначен только для обработки запросов GET HTTP.

Теперь существует путаница между app.use & app.all. Несомненно, в них есть одна общая черта: оба могут обрабатывать все виды HTTP-запросов. Но есть некоторые отличия, которые рекомендуют нам использовать app.use для middlewares и app.all для обработки маршрутов.

  1. app.use() → Требуется только один обратный вызов.
    app.all() → Может принимать несколько обратных вызовов.

  2. app.use() увидит только, начинается ли URL с указанного пути.
    Но app.all() будет соответствовать полному пути.

Например,

app.use( "/book" , middleware);
// will match /book
// will match /book/author
// will match /book/subject

app.all( "/book" , handler);
// will match /book
// won't match /book/author   
// won't match /book/subject    

app.all( "/book/*" , handler);
// won't match /book        
// will match /book/author
// will match /book/author
  1. вызов next() внутри app.use() вызовет либо следующее промежуточное программное обеспечение, либо любой обработчик маршрута, но вызов next() внутри app.all() вызовет обработчик следующего маршрута (app.all(), app.get/post/put... и т.д.) только. Если после этого будет какое-либо промежуточное программное обеспечение, оно будет пропущено. Поэтому рекомендуется размещать все промежуточные программы всегда выше обработчиков маршрутов.

Ответ 6

Помимо приведенных выше объяснений, что я испытываю:

app.use('/book', handler);  

будет соответствовать всем запросам , начиная с '/book' в качестве URL. поэтому он также соответствует '/book/1' или '/book/2'

app.get('/book')  

соответствует только запросу GET с точным соответствием. Он не будет обрабатывать URL-адреса, такие как "/book/1" или "/book/2"

Итак, если вам нужен глобальный обработчик, который обрабатывает все ваши маршруты, тогда вариант app.use('/'). app.get('/') будет обрабатывать только корневой URL.