Express.js에서 next ()를 사용하여 다음 미들웨어에 변수 전달


200

글쎄, 내 질문은 첫 번째 미들웨어에서 다른 미들웨어로 변수를 전달하고 싶었지만 이것을 시도했지만 " req.somevariable'정의되지 않은 것으로 지정되었습니다."


//app.js
..
app.get('/someurl/', middleware1, middleware2)
...

////middleware1
...
some conditions
...
res.somevariable = variable1;
next();
...

////middleware2
...
some conditions
...
variable = req.somevariable;
...

작동해야합니다. 질문에 오타가 아닌 res한 미들웨어 1 에서 값을 할당하고 미들웨어 2 에서 값 을 얻으려고 시도 하면 실패 할 수 있습니다 req.
Andreas Hultgren

Thankz @AndreasHultgren
2791897

Local variables are available in middleware via req.app.locals expressjs.com/pt-br/api.html#app.locals
Ronnie Royston

답변:


202

변수가 req아닌 객체에 연결하십시오 res.

대신에

res.somevariable = variable1;

있다:

req.somevariable = variable1;

다른 사람들이 지적했듯이 res.locals미들웨어를 통해 데이터를 전달하는 권장 방법입니다.


13
res.locals.variable = var를 사용하십시오. 다른 답변보기
godzsa

1
변수를 검색하려면 다음 미들웨어 함수에서 req.res.locals.variable을 사용하십시오
William Wu

3
@WilliamWu는 res.locals아닙니다 req.res.locals.
cchamberlain

2
res.locals.myVar갈 길입니다.
jasonseminara

447

이것이 res.locals 객체의 목적입니다. 요청 오브젝트에서 직접 변수를 설정하는 것은 지원되거나 문서화되지 않습니다. res.locals 는 요청 수명 동안 상태를 유지합니다.

지역 주민

요청의 범위가 지정된 응답 로컬 변수를 포함하는 객체로, 해당 요청 / 응답주기 동안 렌더링 된 뷰에서만 사용할 수 있습니다 (있는 경우). 그렇지 않으면이 속성은 app.locals와 동일합니다.

이 특성은 요청 경로 이름, 인증 된 사용자, 사용자 설정 등과 같은 요청 레벨 정보를 노출하는 데 유용합니다.

app.use(function(req, res, next) {
    res.locals.user = req.user;  
    res.locals.authenticated = !req.user.anonymous;
    next();
});

다음 미들웨어에서 변수를 검색하려면 다음을 수행하십시오.

app.use(function(req, res, next) {
    if (res.locals.authenticated) {
        console.log(res.locals.user.id);
    }
    next();
});

66
이것이 왜 대답이 아닌지 모릅니다 . 이것은 요청을 통해 미들웨어에서 변수를 설정 하는 문서화 된 방법입니다.
Sam Holmes

11
res.locals는 요청의 수명주기 동안 렌더링 되는 에서 사용하기위한 것 입니다. 이것이 문서에서 말하는 것입니다. 뷰를 사용하지 않으면 locals 객체에 물건을 두는 것이 과도 하며 관습 이 아닙니다 . 이 경우 Express 또는 요청 수명주기와 같은 개념을 배우면서인지 부하를 줄일 수 있도록 사람들이 협약을 고수하는 경향이 있습니다.
real_ate 2019

2
@real_ate는 res.locals의 기본 사용법이지만 OPs 질문을 다루지 않습니다. 요청 범위 변수를 미래의 미들웨어로 전달하는 것이 때때로 필요하며, 내가 온 시간은 일반적으로 초기 미들웨어에서 다운 스트림 미들웨어로 라우팅되는 청구를 설정하는 초기 미들웨어의 사용자 인증에 관한 것입니다.
cchamberlain 님

14
미들웨어 작성에 대한 Express 문서는 expressjs.com/en/guide/writing-middleware.htmlreq 오브젝트에 변수를 설정합니다 . 섹션을보십시오Middleware function requestTime
메기

2
@goonerify는 운 좋게 응답이 작동하지 않습니다. 응답이 같은 응답 객체의 기능 속성을 호출하여 전송 res.json({})등이 res.locals요청의 삶을 통해 백엔드에서만 사용할 수 있습니다. expressjs.com/en/5x/api.html
cchamberlain

22

모범 사례가와 같은 변수를 전달할 것이라고 생각하지 않습니다 req.YOUR_VAR. req.YOUR_APP_NAME.YOUR_VAR또는 을 고려할 수 있습니다 req.mw_params.YOUR_VAR.

다른 속성을 덮어 쓰지 않도록 도와줍니다.

2020 년 5 월 31 일 업데이트

res.locals 는 당신이 찾고있는 것입니다. 객체는 요청 범위입니다.

요청의 범위가 지정된 응답 로컬 변수를 포함하는 객체로, 해당 요청 / 응답주기 동안 렌더링 된 뷰에서만 사용할 수 있습니다 (있는 경우). 그렇지 않으면이 속성은 app.locals와 동일합니다.

이 특성은 요청 경로 이름, 인증 된 사용자, 사용자 설정 등과 같은 요청 레벨 정보를 노출하는 데 유용합니다.


2
req.YOUR_APP_NAME = {}처음에 어떻게 설정 하시겠습니까? 당신 은 아직 req.YOUR_APP_NAME.someVar당신 에게 쓰지 않으려 고 req.YOUR_APP_NAME아직 정의되지 않은 오류가 발생 합니다.
Kousha

2
@Kousha 라우팅 스크립트 상단에 라우터 미들웨어를 작성할 수 있습니다.router.use(function(req,res,next){req.YOUR_APP_NAME = {};next()})
Tomas

next () 함수를 매개 변수로 전달하는 방법이 있습니까? like (myObj)
philx_x

1
@Kousha-정의되지 않은 오류는 express와 관련이 없으며 존재하지 않는 객체에 속성을 할당하려고합니다. 일반적으로이 작업을 수행하려면을 사용하십시오 req.APP_NS = req.APP_NS || {}; req.APP_NS.somevar = 'value'.
cchamberlain

1
@philx_x, 매개 변수를 next함수에 전달하면 express '오류 처리기가 트리거되고 누락됩니다. 문서를 확인하십시오.
Merl

7

때문 reqres두 개의 서로 다른 객체가.

추가 한 동일한 객체에서 속성을 찾아야합니다.


3

트릭은 매우 간단합니다. 요청주기는 여전히 아주 살아 있습니다. 임시 변수를 만드는 새 변수를 추가하면됩니다.

app.get('some/url/endpoint', middleware1, middleware2);

첫 번째 미들웨어에서 요청을 처리 할 수 ​​있으므로

(req, res, next) => {
    var yourvalue = anyvalue
}

미들웨어 1에서는 다음과 같이 논리를 처리하고 값을 저장합니다.

req.anyvariable = yourvalue

미들웨어 2에서는 다음을 수행하여 미들웨어 1에서이 값을 포착 할 수 있습니다.

(req, res, next) => {
    var storedvalue = req.yourvalue
}

1

위에서 언급했듯이 res.locals는이를 수행하기위한 좋은 (권장) 방법입니다. Express에서이 작업을 수행하는 방법에 대한 빠른 자습서는 여기 를 참조 하십시오 .

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