express.Router와 app.get의 차이점은 무엇입니까?


265

NodeJS와 Express 4로 시작하고 약간 혼란 스럽습니다. Express 웹 사이트를 읽었지만 라우트 핸들러 사용시기 또는 사용 시기 를 볼 수 없습니다 express.Router.

내가 볼 수 있듯이 사용자가 방문했을 때 페이지 또는 무언가를 보여주고 싶다면 다음을 /show사용해야합니다.

var express = require('express')    
var app = express()    
app.get("/show", someFunction)  

처음에는 이것이 오래되었다고 생각했습니다 (Express 3의 경우). 이것이 맞습니까 아니면 이것이 Express 4의 길입니까?

이것이 Express 4에서 수행하는 방법이라면 무엇에 express.Router사용됩니까?

위와 거의 동일한 예제를 읽었지만 다음을 사용합니다 express.Router.

var express = require('express');
var router = express.Router();
router.get("/show", someFunction)

두 예제의 차이점은 무엇입니까?

간단한 테스트 웹 사이트를 원할 경우 어떤 것을 사용해야합니까?


27
A Router.listen()자체 요청을 하지 않습니다 . 응용 프로그램을 여러 모듈로 분리하는 데 유용하며 Router각 모듈을 apprequire().use()미들웨어로 만듭니다.
Jonathan Lonowski

5
@JonathanLonowski가 암시했듯이 app.get(..)구문은 작업을 express.router보다 편리하게 할 수있는 지름길 입니다. 방금 시작한 경우 라우터의 세부 사항에 대해 걱정하지 마십시오.
soulprovidr

1
그래서 당신은 내가 app.get () 순간에만 사용해야한다고 말하고 있습니까? 여전히 서로를 사용해야 할 때에 대해 여전히 혼란스러워
nelson687

11
@ nelson687 그들 사이에 실제로 정해진 규칙은 없습니다. 당신이 느끼는 경우 app's등 자신의 라우팅 방법은 app.get(), 사용자의 요구에 충분 그들을 사용합니다. 는 Router편의 여러 모듈에서 응용 프로그램을 구성 할 수 있도록하는 단지가있다. 가이드에서 " 클래스 모듈 장착 경로 핸들러를 생성하는 데 사용할 수있는의. 예를 완전한 미들웨어 및 라우팅 시스템입니다,이 이유가라고도합니다"미니 응용 프로그램 ". "express.RouterRouter
조나단 Lonowski

답변:


323

app.js

var express = require('express'),
    dogs    = require('./routes/dogs'),
    cats    = require('./routes/cats'),
    birds   = require('./routes/birds');

var app = express();

app.use('/dogs',  dogs);
app.use('/cats',  cats);
app.use('/birds', birds);

app.listen(3000);

dogs.js

var express = require('express');

var router = express.Router();

router.get('/', function(req, res) {
    res.send('GET handler for /dogs route.');
});

router.post('/', function(req, res) {
    res.send('POST handler for /dogs route.');
});

module.exports = router;

경우 var app = express()라고, 앱 객체가 돌려 주어집니다. 이것을 주요 응용 프로그램 으로 생각하십시오 .

경우 var router = express.Router()라고, 약간 다른 미니 응용 프로그램은 반환됩니다. 미니 앱 의 기본 개념 은 앱의 각 경로가 상당히 복잡해질 수 있으며 모든 코드를 별도의 파일로 이동하면 이점이 있다는 것입니다. 각 파일의 라우터는 미니 앱 이되어 메인 앱 과 구조가 매우 유사 합니다 .

위의 예에서 / dogs 경로 의 코드 는 자체 파일로 이동되어 기본 앱을 어지럽히 지 않습니다 . / cats/ birds 의 코드는 자체 파일에서 유사하게 구성됩니다. 이 코드를 3 개의 미니 앱 으로 분리하면 각각의 논리를 따로 따로 작업 할 수 있으며 다른 두 가지에 어떤 영향을 줄지 걱정하지 않아도됩니다.

세 경로 모두와 관련된 코드 (미들웨어)가 있는 경우 통화 전에 기본 앱 에 넣을 수 있습니다 app.use(...). 해당 경로 중 하나와 관련된 코드 (미들웨어)가있는 경우 해당 경로의 파일에만 코드를 넣을 수 있습니다.


app.use('/dogs', dogs)(app)경로를 정의하고 있기 때문에 앱 객체를 전달할 필요가 없으며 (이 경우 잘못된 경우 수정) 앱 객체가 이전에 배치 된 모든 미들웨어를 가지고 있습니다 추가 미들웨어가 앱 오브젝트에 추가됩니다 (더 많은 미들웨어가 개 경로에 있다고 가정). 사용 route.get('/dogs', route)하는 경우 해당 라우터에 정의 된 경로와 상호 작용할 때 미들웨어를 앱 객체로 전달하고 앱 범위가 경로를 벗어난 경우 해당 미들웨어에 액세스 할 수 없습니다.
Ravenous

1
경로가로 앱에 전달되므로 앱을 경로로 전달할 필요가 없습니다 app.use('/dogs', show). 이러한 방식으로 경로는 앱과 독립적이며 모든 Express 앱에서 재사용 할 수 있습니다. 해당 경로에서 경로를 사용하기 전에 어디에나 배치 된 미들웨어. app.js의 모든 경로 위에 미들웨어를 배치하면 모든 경로가 해당 미들웨어를 사용합니다. 라우트 파일 (dogs.js) 내에 미들웨어를 배치하면 해당 라우트 만이를 사용합니다. dogs.js 안에 GET 라우트 뒤에 미들웨어를 배치하면 POST 라우트 만 사용합니다 (응답으로 끝나는 한).
Nocturno

아 내 나쁜. app.get('/dogs'dogs,)(app)app.get 및 route.get의 get 기능에 대한 질문이 있기 때문에 나는 썼습니다. 관리가 가능하도록 경로를 분리하는 방법을 보여주었습니다. 그러나 우리가 이야기하고 있다면 내 일화가 정확하지 app.get않습니까? PC에 올라 타면 위의 설명을 편집하겠습니다.
Ravenous

2
express.Router () 또는 express ()를 사용할 때도 내 앱이 여전히 작동합니다. 차이점을 이해할 수 없었습니다. (
Ajay Suwalka

3
@Ajay Suwalka 이미 말한 내용을 더 자세히 설명 할 수있는 방법을 모르겠습니다. 문서에 "라우터 객체는 미들웨어와 라우트의 분리 된 인스턴스입니다"라고 말합니다. 또한 위의 @Jonathan Lonowski의 의견은 "A 자체 요청 Router은 아닙니다 .listen()". 이것이 주요 차이점 일 수 있습니다.
녹턴

29

Express 4.0은 새로운 라우터와 함께 제공됩니다. 사이트에서 언급했듯이 :

express.Router 클래스를 사용하여 모듈 식 마운트 가능 경로 처리기를 만들 수 있습니다. 라우터 인스턴스는 완전한 미들웨어 및 라우팅 시스템입니다. 이러한 이유로 종종 "미니 앱"이라고합니다.

https://scotch.io/tutorials/learn-to-use-the-new-router-in-expressjs-4에 좋은 기사 가 있으며, 라우터와의 차이점과 수행 할 수있는 작업을 설명합니다.

요약

라우터를 사용하면 코드를보다 쉽게 ​​모듈화 할 수 있습니다. 라우터를 다음과 같이 사용할 수 있습니다.

  1. 기본 경로 : 홈, 정보
  2. 콘솔에 요청을 기록하도록 미들웨어 라우팅
  3. 매개 변수가있는 경로
  4. 특정 매개 변수의 유효성을 검사하기 위해 매개 변수 용 경로 미들웨어
  5. 특정 경로로 전달 된 매개 변수의 유효성을 검사합니다

노트 :

app.router익스프레스 4 제거 하였다 목적은, 그 응용 프로그램은 명시 적으로로드했다 익스프레스 3와 달리, 기지국 고속 라우터에 단지 참조되면, 새로운 버전 익스프레스 5에 복귀했다.


7
app.route('/book')
  .get(function (req, res) {
    res.send('Get a random book')
  })
  .post(function (req, res) {
    res.send('Post a random book')
  })

위의 예와 같이 경로 아래에 다른 HTTP 요청 방법을 추가 할 수 있습니다.


5

응용 프로그램이 약간 복잡하다고 가정 해 봅시다. 따라서 우리가 가장 먼저하는 일은 하나의 모듈에서 변경이 다른 모듈을 혼란스럽게하지 않고 개별 모듈에서 계속 작업 할 수 있도록 응용 프로그램을 여러 모듈로 나누는 것입니다. 그러나 하루가 끝나면 모든 것을 하나로 통합해야합니다. 단일 응용 프로그램을 구축하고 있습니다. 마치 하나의 기본 응용 프로그램과 부모가 기본 응용 프로그램 인 자식 응용 프로그램이 거의없는 것과 같습니다. 부모 응용 프로그램을 만들 때

var express = require('express');
var parent = express();

그리고이 부모 신청서에 우리는 자녀 신청서를 가져와야합니다. 그러나 자식 응용 프로그램은 완전히 다른 응용 프로그램이 아니기 때문에 (동일한 자바 용어로 실행되므로) Express는 Expresse의 라우터 기능을 사용하여 수행 할 수있는 방법을 제공하며 이는 각 자식 모듈 파일에서 수행하는 작업입니다. aboutme 와 같은 하위 모듈 중 하나를 호출 할 수 있습니다 .

var express = require('express');
var router = express.Router();
/**
** do something here
**/
module.exports = router;

으로 module.exports 우리가 소비하는 우리가 일을 모듈화했기 때문에 우리는 모듈이 노드의 수단에 의해 부모 응용 프로그램에서 사용할 파일을 만들 필요가 다른 모든 타사 모듈과 부모 파일 외모와 같은 기능을 필요로하는 다른이 모듈을 이용할 수있게된다 이 같은.

var express = require('express') 
var parent = express() 
var child = require(./aboutme)

이 자식 모듈을 부모가 사용할 수있게 한 후에는이 자식 응용 프로그램을 언제 사용할 것인지 부모 응용 프로그램에 알려야합니다. 사용자가 경로에 도달하면 요청을 처리하기 위해 나에 대한 자식 응용 프로그램이 필요하며 Expresse의 use 메소드를 사용하여 수행한다고 가정 해 봅시다 .

parent.use('/aboutme',  aboutme);

그리고 한 번에 부모 파일은 다음과 같습니다

var express = require('express');
var parent = express();
var child = require(./aboutme);
/***
**do some stuff here
**/
parent.use('/aboutme',child);

무엇보다도 부모가 할 수있는 일은 자식이 할 수없는 서버를 시작할 수 있다는 것입니다. 이것이 분명히되기를 바랍니다. 자세한 내용은 항상 시간이 걸리지 만 많은 정보를 제공하는 소스 코드를 볼 수 있습니다. 감사합니다.


1
이러면 안 parent.use('/aboutme', child)됩니까?
Kees de Kooter

2

app.js를 사용하여 경로를 작성한다는 것은 app.js가 응용 프로그램 시작시로드 될 때 모든 사용자가 액세스 할 수 있음을 의미합니다. 그러나 express.router () 미니 앱에 경로를 설정하면 액세스 가능성을 보호하고 제한 할 수 있습니다.


2

express.Router 많은 옵션이 있습니다 :

  • 대소 문자 구분 가능 : /showroute와 동일하지 않음 /Show.이 동작은 기본적으로 비활성화되어 있습니다.
  • 엄격한 라우팅 모드 : /show/와 동일하지 않은 라우팅 /show,이 동작은 기본적으로 비활성화되어 있습니다
  • 특정 경로에 특정 미들웨어를 추가 할 수 있습니다

0

한마디 로 미들웨어와 express.Router비교할 때 더 많은 일을 할 app.get()수 있습니다.express.Router()

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.