NodeJS / Express :“app.use”란 무엇입니까?


332

에서 NodeJS에 대한 문서 express모듈 , 예 코드 갖는다 app.use(...).

use기능 은 무엇 이며 어디에 정의되어 있습니까?



이러한 유형의 질문은 설명서를 읽으면 대답 할 수 있습니다.
Mina

47
이 문서는 초보자를위한 약간의 암호입니다
KansaiRobot

6
위의 가능한 중복은 서로를 참조하고 있습니다
Afrig Aminuddin

1
문서가 완전히 불분명합니다
Tessaracter

답변:


370

응용 프로그램 개체는 Express 서버를 만들 때 인스턴스화됩니다. 사용자 정의 할 수 있는 미들웨어 스택 이 있습니다 app.configure()(이제 버전 4.x에서 더 이상 사용되지 않음) .

미들웨어를 설정하려면 app.use(<specific_middleware_layer_here>)추가하려는 모든 미들웨어 계층에 대해 호출 할 수 있으며 (모든 경로에 대해 일반적이거나 서버가 처리하는 특정 경로에서만 트리거 될 수 있음) Express 미들웨어 스택에 추가됩니다 . 미들웨어 계층은 여러 번의 호출로 하나씩 추가 use하거나 한 번의 호출로 한 번에 모두 추가 할 수 있습니다 . 자세한 내용은 use설명서 를 참조하십시오.

Express Middleware의 개념 이해에 대한 예를 제공하기 위해 다음은 내 앱 객체를 콘솔에 JSON으로 로깅 할 때 내 앱 미들웨어 스택 (app.stack)의 모습입니다.

stack: 
   [ { route: '', handle: [Function] },
     { route: '', handle: [Function: static] },
     { route: '', handle: [Function: bodyParser] },
     { route: '', handle: [Function: cookieParser] },
     { route: '', handle: [Function: session] },
     { route: '', handle: [Function: methodOverride] },
     { route: '', handle: [Function] },
     { route: '', handle: [Function] } ]

당신은 추론 할 수있을 때, 나는 전화 app.use(express.bodyParser()), app.use(express.cookieParser())등, 미들웨어 스택이 명시 미들웨어 '층'을 추가하는합니다. 경로는 비어 있습니다. 즉, 해당 미들웨어 레이어를 추가 할 때 경로에서 트리거되도록 지정했습니다. 위의 스택 출력에서 ​​해당 미들웨어 계층 객체 /user/:idroute필드에 문자열로 반영되는 경로에서만 트리거되는 사용자 정의 미들웨어 계층을 추가 한 경우 .

각 계층은 기본적으로 미들웨어를 통한 흐름에 무언가를 처리하는 기능을 추가합니다.

예를 들어 bodyParser, 서버를 통해 명시 적 미들웨어를 통해 들어오는 요청을 처리 할 수 ​​있습니다 . 따라서 이제는 수신 요청 본문을 구문 분석하는 것이 호출을 요청 했기 때문에 수신 요청을 처리 할 때 미들웨어가 수행하는 절차의 일부입니다app.use(bodyParser) .


116
감사합니다. 급행 사람들이 API 문서에서 이것을 설명하기가 너무 어려울까요?
ericsoco

4
따라서 요청을 받으면 실제 서비스에 도달하기 전에 해당 파서를 통해 데이터가 전달된다는 것을 의미합니다. 예를 들어, 유효한 요청-> 인증-> 프로세스 요청-> ServResponse USE 는 특정 순서로 해당 단계를 제어하고 병렬로 실행하지 않습니까?
Adam Hess

2
app.use () 의존성 주입이 작동합니까?
Kevin C.

8
app.use로 전송 된 함수는 언제 호출됩니까? 급행 서버를 만들거나 모든 요청에 ​​대해?
Timo Huovinen

5
@KevinC. 아니요, 의존성 주입이 아닙니다. 플러그인 아키텍처입니다. 일반적으로 이러한 종류의 아키텍처를 필터 시스템 / 필터 파이프 라인 / 파이프 및 필터라고합니다. Express에서 파이프는 next()각 미들웨어가 파이프 라인의 다음 기능으로 처리를 전달하기 위해 호출 할 콜백입니다. 라우팅 시스템 (에 대한 첫 번째 인수는 app.use()) URL에 따라 지점에 파이프 라인 수 있습니다
slebetman

50

useExpress HTTP 서버 오브젝트의 라우트에서 사용되는 미들웨어를 구성하는 방법입니다. 이 방법은 Express가 기반으로하는 Connect의 일부로 정의 됩니다.

업데이트 버전 4.x부터 Express는 더 이상 Connect에 의존하지 않습니다 .

이전에 Express에 포함 된 미들웨어 기능은 이제 별도의 모듈에 있습니다. 미들웨어 기능 목록을 참조하십시오 .


3
온라인 문서는 여기에 있습니다 : senchalabs.org/connect/proto.html#app.use
Alexander Bird

노드 미들웨어가 객체를 인스턴스화하는 것이 효율적입니까? 이것은 모든 요청에서 미들웨어가 새로운 객체를 인스턴스화한다는 것을 의미합니까? 오래된 물체는 버려 집니까? 예를 들어app.use(function(){ var object = new SomeConstructor; next(); })
CMCDragonkai

1
@CMCDragonkai 모든 요청에서 객체를 인스턴스화하는 것이 좋습니다. 요청 핸들러 범위 밖의 객체에 대한 참조를 저장하지 않는 한 가비지 수집됩니다.
jeff_mcmahan

1
링크에 대한 @AlexanderBird thx (첫 번째 링크는 이제 깨졌습니다). 레코드의 경우, 두 번째 링크에서 doc의 시작 부분에 "주어진 미들웨어 핸들을 주어진 경로에 사용하고 기본값은 /"로 표시됩니다.이 "경로"는 / 이외의 값이 제공 될 때 미들웨어의 마운트 지점입니다. 미들웨어는 해당 세그먼트가 요청의 경로 이름에 존재하는 경우에만 유효합니다. 예를 들어 / admin에서 함수를 마운트하는 경우 / admin 및 / admin / settings에서 호출되지만 /에 대해 호출되지 않습니다. 또는 / posts " 간단한 :)
Adrien 수

40

app.use (middleware) 는 요청이 서버로 전송 될 때마다 호출됩니다.


7
한 문장으로 된 답변은 다른 여러 단락 설명보다 즉각적으로 이해되고 도움이됩니다.
stackedAndOverflowed

16

미들웨어 함수를 마운트하거나 지정된 경로에 마운트하는 데 사용되는 app.use () 미들웨어 함수는 기본 경로가 일치 할 때 실행됩니다.

예를 들어 indexRouter.js에서 app.use ()를 사용하는 경우 다음과 같습니다.

//indexRouter.js

var adsRouter = require('./adsRouter.js');

module.exports = function(app) {
    app.use('/ads', adsRouter);
}

위의 코드 app.use ()에서 '/ ads'의 경로를 adsRouter.js로 마운트하십시오.

이제 adsRouter.js에서

// adsRouter.js

var router = require('express').Router();
var controllerIndex = require('../controller/index');
router.post('/show', controllerIndex.ads.showAd);
module.exports = router;

adsRouter.js에서 ads- '/ ads / show'의 경로는 다음과 같으며 controllerIndex.ads.showAd ()에 따라 작동합니다.

app.use ([path], callback, [callback]) : 콜백을 추가 할 수 있습니다.

app.use('/test', function(req, res, next) {

  // write your callback code here.

    });

이해하기 쉬운 "mount"대신 "map"을 사용하겠습니다.
Jeb50

13

app.use () 는 express 앱에서 미들웨어 역할을합니다. 달리 app.get ()app.post () 정도, 실제로 사용할 수 있습니다 () app.use 요청 URL을 지정하지 않고. 이 경우 어떤 URL이 적중 되더라도 매번 실행됩니다.


7

app.use ()는 다음과 같이 작동합니다.

  1. 노드 http 서버 인스턴스에서 요청 이벤트가 심사되었습니다.
  2. express는 req 객체로 내부 조작을 수행합니다.
  3. app.use로 지정한 작업을 express가 시작하는 시점입니다.

매우 간단합니다.

그리고 나서야 만 표현은 라우팅과 같은 나머지 작업을 수행합니다.


6
app.use(function middleware1(req, res, next){
   // middleware1 logic
}, function middleware1(req, res, next){
   // middleware2 logic
}, ... middlewareN);

app.use 는 미들웨어 등록 순서에 따라 엔드 라우트 논리 또는 중간 라우트 논리를 실행하기 전에 미들웨어 또는 미들웨어 체인 (또는 다중 미들웨어) 을 등록하는 방법 입니다.

미들웨어 : 형태 체인 기능 / 미들웨어 기능 을 가진 3 개 파라미터 REQ, 입술, 옆 . 다음은 체인의 다음 미들웨어 기능 및 체인의 마지막 미들웨어 기능의 경우 다음 등록 미들 체인의 첫 번째 미들웨어 기능을 가리키는 콜백입니다.


1
매력처럼 작동합니다!
Anmol Rai

3

"express"에서 express를 가져 와서 app = express (); 그런 다음 Express의 모든 기능을 갖춘 앱

app.use ()를 사용하면

전체 익스프레스 프로젝트에서 사용할 수있는 모든 모듈 / 미들웨어 기능


3

app.use미들웨어가 필요한 기능입니다. 예를 들면 다음과 같습니다.

 app.use('/user/:id', function (req, res, next) {
       console.log('Request Type:', req.method);
        next();
     });

이 예는 /user/:id경로에 설치된 미들웨어 기능을 보여줍니다 . 이 기능은 /user/:id경로 에있는 모든 유형의 HTTP 요청에 대해 실행됩니다 .

REST 웹 서버와 유사하며 /xx다른 조치를 나타 내기 위해 다른 것을 사용하십시오 .


답변 주셔서 감사하지만 다른 사람이 이미 모든 정보를 말했기 때문에 나는이 정보를지지하지 않을 것입니다. 나는 표현이 무엇을 use할 수 있는지에 대한 모든 설명이 필요하다고 생각하지 않습니다 . 나는 그것이 그것이 무엇인지 알 필요가 있었다.
Alexander Bird

3

app.use 는 앱 요청을위한 미들웨어 로 작동합니다. 통사론

app.use('pass request format',function which contain request response onject)

app.use('/',funtion(req,res){
 console.log(all request pass through it);
// here u can check your authentication and other activities.
})

또한 요청을 라우팅 할 때 사용할 수 있습니다.

app.use('/', roting_object);

2

미들웨어는 "함께 결합"하는 소프트웨어의 일반적인 용어이므로 app.use는 미들웨어를 구성하는 방법입니다 (예 : 요청 본문 구문 분석 및 처리). app.use (bodyParser.urlencoded ({extended : true })); app.use (bodyParser.json ()); Express 응용 프로그램에서 사용할 수있는 많은 미들웨어가 문서를 읽으십시오. http://expressjs.com/en/guide/using-middleware.html


2

app.use는 지정된 미들웨어를 기본 앱 미들웨어 스택에 적용합니다. 기본 앱 스택에 미들웨어를 첨부 할 때 첨부 순서가 중요합니다. 미들웨어 B 앞에 미들웨어 A를 연결하면 미들웨어 A가 항상 먼저 실행됩니다. 특정 미들웨어가 적용 가능한 경로를 지정할 수 있습니다. 아래 예에서 "hello world"는 항상 "happy holidays"전에 기록됩니다.

const express = require('express')
const app = express()

app.use(function(req, res, next) {
  console.log('hello world')
  next()
})

app.use(function(req, res, next) {
  console.log('happy holidays')
  next()
})

2

그것은 당신이 (모든 미들웨어를 사용할 수 있습니다 더 읽기 등) body_parser, CORS등 미들웨어는 변경 할 수 requestresponse개체를. 또한 코드를 실행할 수도 있습니다.


답변 주셔서 감사합니다,하지만 난 모든 정보가 이미 다른 답변에 캡처되어 있다고 생각합니다
Alexander Bird

2

당신은 또한 같은 자신의 미들웨어 기능을 만들 수 있습니다

app.use( function(req, res, next) {
  // your code 
  next();
})

그것은 세 가지 매개 변수를 포함 req, res, next
를 청소 컨트롤러를 유지하기 위해 인증 및 입력 PARAMS의 확인을 위해 사용할 수 있습니다.

next()다음 미들웨어 또는 경로로 이동하는 데 사용됩니다.
미들웨어로부터 응답을 보낼 수 있습니다


1

app.use () 및 app.METHOD () 함수를 사용하여 애플리케이션 레벨 미들웨어를 앱 오브젝트의 인스턴스에 바인드하십시오. 여기서 METHOD는 미들웨어 함수가 처리하는 요청의 HTTP 메소드 (예 : GET, PUT 또는 POST)를 소문자로 입력하십시오.


1

간단히 말해 app.use ()는 모든 유형의 요청 (예 : get, post, ...)을 지원하므로 대부분 미들웨어를 설정하는 데 사용됩니다. 경로와 기능이 분리 된 경우에 사용 가능

예:

app.use("/test",functionName)

functionName은 다른 파일에 있습니다.


답변 주셔서 감사하지만 모든 정보가 이미 다른 답변에 캡처되어 있다고 생각합니다.
Alexander Bird

1

app.use() 미들웨어 방법입니다.

미들웨어 메소드는 Java의 인터셉터와 유사하며이 메소드는 항상 모든 요청에 ​​대해 실행됩니다.

미들웨어의 목적 및 사용 :-

  1. 세션이 만료되었는지 확인하려면
  2. 사용자 인증 및 권한 부여
  3. 쿠키 확인 (만료일)
  4. 응답하기 전에 데이터 구문 분석

미들웨어는 app.use ()에 전달 된 함수입니다.
NattyC

1

app.use
는 express (nodejs middleware framework)에 의해 작성됩니다.
app.use는 intilization 프로세스에서 특정 쿼리를 실행하는 데 사용됩니다.
server.js (node)
var app = require ( 'express'); 따라서 서버를 시작할 때마다 기본적으로 app.use 함수가 호출됩니다.
app.use(bodyparser.json())


0

app.use는 애플리케이션 레벨 미들웨어입니다.

app.use () 및 app.METHOD () 함수를 사용하여 애플리케이션 레벨 미들웨어를 앱 오브젝트의 인스턴스에 바인드하십시오. 여기서 METHOD는 미들웨어 함수가 처리하는 요청의 HTTP 메소드 (예 : GET, PUT 또는 POST)를 소문자로 입력하십시오.

app.use를 사용하여 요청에서 토큰을 확인하여 미들웨어를 작성해야하는 토큰 / 액세스 토큰을 확인하려는 경우와 같이 모든 요청을 확인하는 데 사용할 수 있습니다.

이 예는 마운트 경로가없는 미들웨어 기능을 보여줍니다. 이 함수는 앱이 요청을받을 때마다 실행됩니다.

var app = express()

app.use(function (req, res, next) {
  console.log('Time:', Date.now())
  next()
})

https://expressjs.com/en/guide/using-middleware.html 에서 참조


app.use ()는 미들웨어가 아닙니다. 미들웨어는 app.use ()에 전달 된 함수입니다.
NattyC

0

app.use (path, middleware) 는 경로가 해당 경로에 도달하기 전에 호출해야하는 미들웨어 함수를 호출하는 데 사용됩니다. app.use를 통해 여러 미들웨어 함수를 호출 할 수 있습니다.

app.use ( '/ fetch', enforceAuthentication) -> enforceAuthentication 미들웨어 fn은 '/ fetch'로 시작 하는 요청이 수신될 때 호출됩니다. 그것은 할 수 있습니다 / / 사용자 가져 오기 , / 가져 오기 / IDS / {ID}

요청과 상관없이 일부 미들웨어 기능을 호출해야 할 수도 있습니다. 이러한 경우 경로가 지정되지 않으며 경로의 기본값은 / 이고 모든 요청은 /로 시작하므로 모든 요청 에 대해이 미들웨어 함수가 호출됩니다.

app.use (() => {// 공통 서비스 초기화})

여러 미들웨어 함수가 app.use 로 전달 될 때 각 미들웨어 함수 내에서 next () fn을 호출해야합니다 . 그렇지 않으면 다음 미들웨어 함수가 호출되지 않습니다.

참조 : http://expressjs.com/en/api.html#app.use

참고 : 문서는 호출하여 우리는 현재 다음과 같은 미들웨어 기능을 우회 할 수 말한다 ( '경로') 다음 현재 미들웨어 함수 내,하지만이 기술은 app.use에서 나를 위해 일을하지 않았다 하지만 app.METHOD로 일했다 아래와 같이 . 따라서 fn1과 fn2는 호출되었지만 fn3은 호출되지 않았습니다.

app.get('/fetch', function fn1(req, res, next)  {
    console.log("First middleware function called"); 
        next();
    }, 
    function fn2(req, res, next) {
        console.log("Second middleware function called"); 
        next("route");
    }, 
    function fn3(req, res, next) {
        console.log("Third middleware function will not be called"); 
        next();
    })
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.