NODE_ENV 란 무엇이며 Express에서 사용하는 방법은 무엇입니까?


184

이것은 내 응용 프로그램이며 현재 프로덕션에서 실행 중입니다.

var app = express();
app.set('views',settings.c.WEB_PATH + '/public/templates');
app.set('view engine','ejs');
app.configure(function(){
    app.use(express.favicon());
    app.use(express.static(settings.c.WEB_PATH + '/public'));
    app.use(express.bodyParser());
    app.use(express.cookieParser());
    app.use(express.methodOverride());
    app.use(express.session({
            cookie:{ domain:"."+settings.c.SITE_DOMAIN, maxAge:1440009999},
            secret:'hamster',
            store: r_store,
            }));
    app.use(useragent.express());
    app.use(flash());
    app.use(passport.initialize());
    app.use(passport.session());
});

그러나 나는 그것을 알고 NODE_ENV사용하고 싶었습니다. 어떻게해야합니까?


귀하의 경우 app.configure('development', ...)개발 또는 프로덕션 환경에 대해서만 특정 설정을 설정하기 위해 "생산" 이라고 가정 할 수 있습니다 . 참조 expressjs.com/api.html#app.configure
안드레아스 Hultgren

답변:


360

NODE_ENV입니다 환경 변수 에 의해 대중에게 명시 웹 서버 프레임 워크. 노드 응용 프로그램이 실행될 때 환경 변수의 값을 확인하고 값에 따라 다른 작업을 수행 할 수 있습니다. NODE_ENV구체적으로는, 특정 환경에 있는지 상태 (일반적으로)를 사용하고 생산 또는 개발 환경. 일반적인 사용 사례는 개발 환경에서 실행중인 경우 추가 디버깅 또는 로깅 코드를 실행하는 것입니다.

NODE_ENV에 액세스

다음 코드를 사용하여 환경 변수에 직접 액세스하여 자체 검사 및 논리를 수행 할 수 있습니다.

var environment = process.env.NODE_ENV

또는 대안으로 express '를 사용 하십시오app.get('env') ( 참고 : 이 기본값은 "development")

NODE_ENV환경에 대해 명시 적으로 설정하지 않은 경우이 설정 이됩니다 undefined.

NODE_ENV 설정

실제로 환경 변수를 설정하는 방법은 운영 체제마다 다르며 사용자 설정에 따라 다릅니다.

환경 변수를 일회용으로 설정하려면 명령 행에서 수행 할 수 있습니다.

  • 리눅스 & 맥 :export NODE_ENV=production
  • :$env:NODE_ENV = 'production'

장기적으로는 재부팅 할 때 설정이 해제되지 않도록이를 유지해야합니다.이를 수행 할 수있는 모든 가능한 방법을 나열하는 대신 직접 수행하는 방법을 검색하도록하겠습니다!

컨벤션에 따르면 NODE_ENV, production또는 development모두 소문자로 사용해야하는 값은 두 개뿐입니다 . 더 많은 값을 추가하는 것을 막을 수는 없지만, 내가 사용하는 많은 node_modules에서 이러한 종류의 코드를 많이 볼 때 좋은 생각은 아닙니다.

var development = process.env.NODE_ENV !== 'production';

그것이 있다고 주 정말 나쁜 세트에 시도하는 생각 NODE_ENV에서 노드 응용 프로그램 자체 당신이 할 할 경우 - 에만이 설정되는 과정에 적용되는 상황이 아마 작업 당신이 그들에 기대하는 것 같은. 하지 마십시오. 후회하게됩니다.


5
Express 4에서는 app.configure()제거되었습니다. 익스프레스 4 마이그레이션 가이드 에 권장 "사용 process.env.NODE_ENV또는 app.get('env')환경을 감지하고 그에 따라 응용 프로그램을 구성하는."
Chris Bartley 14

3
나는 환경이 디바이스에 정의되지 않은 노드 기본값 인 경우 때문에 경우처럼 자신이 정의되지 않은주는 변수 확인 app.get ( 'ENV')를 사용하는 것이 가장 좋습니다 생각
light24bulbs

11
좋은 지적-나는 기본값을 강조하기 위해 메모를 추가했습니다. 그러나 내 개인적인 느낌은 app.get('env')그 이유를 정확하게 사용해서는 안된다는 것입니다 . 이 중요한 변수가 설정되어 있지 않으므로 Express 외부에서 액세스 할 때 일관되지 않은 것처럼 보입니다. 또한 실수 로 프로덕션 환경에서 실행하는 것보다 개발 환경에서 실수로 디버그 코드를 실행하지 않는 것이 덜 위험하다고 생각 합니다.
Ed Hinchliffe

5
Express 응용 프로그램에서 NODE_ENV 설정을 생략하면 효과를 측정했습니다. 기본값은 development무엇보다도 템플릿이 모든 요청에 ​​대해 재 처리됨을 의미합니다. 결과적으로 Jade를 사용할 때 생산과 개발 사이에서 ~ 75 %의 성능 향상 또는 배수가 발생합니다. 또한 apmblog.dynatrace.com/2015/07/22/…
DanielKhan

8
"생산"및 "개발"외에, 명시 적 프로젝트를 위해서는 최소한 자동화 된 테스트를 실행하기위한 다른 "테스트"가 필요하다고 생각합니다. 채워진 테스트 데이터에 다른 DB를 사용할 수 있습니다.
dawnstar

19

NODE_ENV노드 환경 을 나타내는 환경 변수입니다 Express 서버의 을 나타내는 .

우리가 어떤 환경에 있는지 설정하고 감지하는 방법입니다.

사용하는 것이 매우 일반적 production이며development 입니다.

세트:

export NODE_ENV=production

가져 오기:

당신은 그것을 사용하여 얻을 수 있습니다 app.get('env')


11

원래 질문에 Express가이 환경 변수를 사용하는 방법이 포함되어 있다고 가정합니다.

Express는 NODE_ENV를 사용하여 자체 기본 동작을 변경합니다. 예를 들어, 개발 모드에서 기본 오류 처리기는 스택 추적을 브라우저로 다시 보냅니다. 프로덕션 모드에서는 Internal Server Error구현 세부 정보가 세상에 유출되는 것을 피하기 위해 간단히 응답 합니다.


0

일반적으로 NODE_ENV코드를 개발, 테스트 및 디버깅 할 때 변수를 사용하여 특별한 조치를 취합니다. 예를 들어 프로덕션에서 원하지 않는 자세한 로깅 및 디버그 출력을 생성합니다. Express의 NODE_ENV설정 여부에 따라 Express 자체가 다르게 작동합니다 production. 이 행을 Express 앱에 넣고 HTTP GET 요청을하면 다음을 볼 수 있습니다 /error.

app.get('/error', function(req, res) {
  if ('production' !== app.get('env')) {
    console.log("Forcing an error!");
  }
  throw new Error('TestError');
});

app.use(function (req, res, next) {
  res.status(501).send("Error!")
})

후자 app.use()는 다른 모든 메소드 핸들러 다음에 마지막이어야합니다!

사용자가 설정 한 경우 NODE_ENVproduction당신은 당신의 서버를 시작하고 보내기 전에 GET /error그것에 요청을, 당신은 텍스트 표시 안 Forcing an error!콘솔에서, 그리고 응답은 (익스프레스로부터의 기원) HTML 본문에서 스택 추적을 포함 할 수 없습니다. 대신에NODE_ENV 서버를 시작하기 전에 다른 것으로 하면 반대의 상황이 발생합니다.

Linux에서 환경 변수 NODE_ENV를 다음과 같이 설정하십시오.

NODE_ENV = ' value ' 내보내기

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