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

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


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

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

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



답변

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

대신에

res.somevariable = variable1;

있다:

req.somevariable = variable1;

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


답변

이것이 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();
});


답변

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

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

2020 년 5 월 31 일 업데이트

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

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

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


답변

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

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


답변

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

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
}


답변

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


답변