it-source

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

criticalcode 2022. 12. 19. 21:21
반응형

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;
...

이것이 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 ""가 아닌 ""res.

대신

res.somevariable = variable1;

가지고 있다:

req.somevariable = variable1;

res.locals는 미들웨어를 통해 데이터를 전달하는 권장 방법입니다.

라고 하는 를 건네주는 req.YOUR_VAR을 고려하는 것이 .을 검토하는 것이 좋을 것 같습니다.req.YOUR_APP_NAME.YOUR_VAR ★★★★★★★★★★★★★★★★★」req.mw_params.YOUR_VAR.

다른 Atribut의 덮어쓰기를 방지하는 데 도움이 됩니다.

및인 패턴은 요청 """에 값을 입니다.req.

이 경우 다음과 같은 미들웨어가 있어야 합니다.

app.use(function (req, res, next) {
  req.someVariable = 123;
  next();
});

app.use(function (req, res, next) {
  console.log("The variable is", req.someVariable);
  next();
});

이 패턴에는 많은 일반적인 사용 사례가 있으며, 익스프레스 커뮤니티에서는 표준적인 사용 방법입니다.예를 들어 다음과 같습니다.


현재 가장 높은 투표율을 보이고 있는 답변이 잘못 권장되고 있는 경우res.locals문서 오독에서 비롯된 것 같습니다.그 때문에, 이 문제에 대한 통상적인 어프로치가 아닌 이유에 대해 설명하겠습니다(특별히 해롭지도 않습니다).

문서

★★★★★★★의 res.locals현재 시대에 뒤떨어진 문서를 예로 들 수 있습니다.

요청에 대한 응답 로컬 변수를 포함하는 개체. 따라서 요청/응답 주기 동안 렌더링된 보기(있는 경우)에만 사용할 수 있습니다.그렇지 않으면 이 속성은 app.locals와 동일합니다.

이 속성은 요청 경로 이름, 인증된 사용자, 사용자 설정 등의 요청 수준 정보를 노출하는 데 유용합니다.

.「 。res.locals는 "해당 요청 렌더링된 뷰"에만 사용할 수 있는 변수입니다(추가).

이 바로 게거그 that의 말이다.res.locals련되되res.render로컬 액세스뿐만 아니라 일부 데이터가 포함된 템플릿 파일을 렌더링합니다.이는 v2 문서에서 더 명확했으며, 현재 Express 문서를 보다 명확하게 업데이트했습니다.

res.render로 렌더링된 템플릿에서 액세스할 수 있는 변수를 설정하려면 이 속성을 사용합니다.res.locals에 설정된 변수는 단일 요청-응답 사이클 내에서 사용할 수 있으며 요청 간에 공유되지 않습니다.

요청 간 템플릿 렌더링에 사용할 로컬 변수를 유지하려면 대신 app.locals를 사용하십시오.

이 속성은 요청 경로 이름, 인증된 사용자, 사용자 설정 의 요청 수준 정보를 응용 프로그램 내에서 렌더링되는 템플릿에 노출할 때 유용합니다.

(강조 추가)

가이드

reqWriting Middleware에 관한 가이드에 표준 접근법이 기재되어 있습니다.이 가이드는 다음과 같습니다.

다음으로 "requestTime"이라는 미들웨어 함수를 만들고 requestTime이라는 속성을 요청 오브젝트에 추가합니다.

const requestTime = function (req, res, next) {
 req.requestTime = Date.now()
 next()
}

이 질문에 대한 답변에서 이 내용이 언급되었을 때 한 사용자는 다음과 같이 대답했습니다.「이것은, res.locals 가 추가되기 전의 방식입니다.오래된 docs일 수 있습니다.res.locals는 이 문제에 특화된 네임스페이스입니다.」

그러나 이는 코드베이스의 역사와는 일치하지 않습니다.v2부터 로컬이 존재해 왔습니다.v2보다 훨씬 이전 버전입니다. express.json이 되어 있기 에 실제로 이 하는 것이 입니다.그 시점에서, 가치를 보존하는 것이 정말로 옳았다면, 베바이어를 변경하는 것이 의미가 있었을 것입니다.res.locals.

클로징 노트

코멘트를 썼지만 간과된 @real_ate에게 외칩니다.

그 이유는req그리고.res는 두 개의 다른 객체입니다.

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

요령은 아주 간단해요청 사이클은 아직 거의 활성화되어 있습니다.임시 호출을 생성하는 새 변수를 추가할 수 있습니다.

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에서 이 작업을 수행하는 방법에 대한 간단한 튜토리얼은 여기를 참조하십시오.

언급URL : https://stackoverflow.com/questions/18875292/passing-variables-to-the-next-middleware-using-next-in-express-js

반응형