req.locals vs. res.locals vs. res.data vs. req.data vs. Express 미들웨어의 app.locals


82

비슷한 질문이 있지만 다른 라우팅 미들웨어를 통해 얻은 중간 결과를 전파하려면 가장 좋은 방법은 무엇입니까?

app.use(f1); app.use(f2); app.use(f3);

function f1(req,res,next) {
  //some database queries are executed and I get results, say x1
  res.locals.dbResults = {...};
  next();
}

function f2(req,res,next) {
  // more processing based upon req.locals.dbResults 
  res.locals.moreResults = {....};
  next();
}
// ...

req .locals 를 사용하여 다른 미들웨어를 통해 동일한 데이터 전파를 얻을 수 있다고 생각합니다 . 또한 요청 및 응답 개체 모두 요청 시작시 빈 개체로 초기화 된 지역 속성이있는 것으로 보입니다.

또한 res.mydata 또는 req.mydata 속성도 설정할 수 있습니까?

이론적으로 app.locals는 미들웨어간에 지속될 것이기 때문에 다른 미들웨어를 통해이 데이터를 전달하는 데 사용할 수도 있지만 app.locals의 기존 사용과는 반대입니다. 애플리케이션 특정 데이터에 더 많이 사용됩니다. 다음 요청에 동일한 변수를 사용할 수 있도록 요청-응답주기가 끝날 때 해당 데이터를 지워야합니다.

미들웨어를 통해 중간 결과를 전파하는 최적의 표준 방법은 무엇입니까?

답변:


151

당신이 언급 한 바와 같이, 둘 req.locals, res.locals또는 심지어 자신의 정의 키를 res.userData사용할 수 있습니다. 그러나 Express와 함께 뷰 엔진을 사용하는 경우 res.locals미들웨어에서 중간 데이터를 설정할 수 있으며 해당 데이터는 뷰에서 사용할 수 있습니다 ( 이 게시물 참조 ). 공식적으로 문서화되지는 않았지만 req.locals에서 뷰 데이터를 덮어 쓰지 않도록 미들웨어 내부의 중간 데이터를 설정하는 것이 일반적 res.locals입니다.

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

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

출처 : http://expressjs.com/en/api.html#res.locals


res.locals에 유리하게 작동하는 문서 구분에 대한 설명에 감사드립니다. 이론적으로 모든 접근 방식이 기술적으로 동일하다는 내 이해를 확인했습니다. 더 많은 댓글을 기다립니다. 귀하의 답변을 찬성했습니다 ... 확실히 유용합니다.
Sunny

사이드 참고 : res.render()인수 우선 순위 res.locals. 그래서 누군가 실수로 이렇게 변수를 덮어 쓸 수 있습니다res.locals = { name: 'Jake' } // later in code... res.render('user.template', { name: 'Tony' }, (err, html) => {}) // the 'name' variable is now 'Tony'
zenoh

어쨌든 잘 계획되고 깔끔한 모듈 식 미들웨어 디자인은 단일 객체 키에 의존하는 것보다 더 좋고 장기적인 솔루션이어야합니다
zenoh
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.