source

TypeScript에서의 process.env 사용

manysource 2023. 3. 1. 11:20

TypeScript에서의 process.env 사용

TypeScript에서 노드 환경 변수를 읽는 방법은 무엇입니까?

사용하는 경우process.env.NODE_ENV다음 오류가 발생하였습니다.

Property 'NODE_ENV' does not exist on type 'ProcessEnv'

설치 완료@types/node하지만 소용이 없어.

인스톨@types/node당신의 프로젝트에서, 당신은 TypeScript에 정확히 어떤 변수가 존재하는지 말할 수 있습니다.process.env:

environment.d.ts

declare global {
  namespace NodeJS {
    interface ProcessEnv {
      GITHUB_AUTH_TOKEN: string;
      NODE_ENV: 'development' | 'production';
      PORT?: string;
      PWD: string;
    }
  }
}

// If this file has no import/export statements (i.e. is a script)
// convert it into a module by adding an empty export statement.
export {}

사용방법:

process.env.GITHUB_AUTH_TOKEN; // $ExpectType string

이 메서드는 IntelliSense를 제공하며 문자열 리터럴 유형도 활용합니다.

주의: 위의 스니펫은 모듈 증설입니다.모듈 증강을 포함하는 파일은 (스크립트가 아닌) 모듈이어야 합니다.모듈과 스크립트의 차이점은 모듈에 적어도1개의 Import/export 스테이트먼트가 있다는 것입니다.

TypeScript에서 파일을 모듈로 취급하려면 Import 스테이트먼트를 1개 추가합니다.뭐든지 될 수 있어요.심지어.export {}할 거다.

노드 프로세스에서 어떤 환경변수를 사용할 수 있을지는 보증되지 않습니다.NODE_ENV변수는 노드 자체에 내장된 것이 아니라 Express에 의해 보급된 규칙일 뿐입니다.따라서 유형 정의에 포함시키는 것은 의미가 없습니다.대신 다음과 같이 정의합니다.

export interface ProcessEnv {
    [key: string]: string | undefined
}

그 말은 즉process.env문자열을 다시 얻기 위해 문자열로 색인화할 수 있습니다(또는undefined(변수가 설정되어 있지 않은 경우).오류를 수정하려면 인덱스 구문을 사용해야 합니다.

let env = process.env["NODE_ENV"];

또는 jcalz가 코멘트에서 지적했듯이 TypeScript 2.2 이후를 사용하는 경우 위에 정의된 것과 같은 인덱스 가능한 유형에 도트 구문을 사용하여 액세스할 수 있습니다.이 경우 코드는 그대로 작동합니다.

사용하기 전에 바로 추가process.env.NODE_ENV다음 행:

declare var process : {
  env: {
    NODE_ENV: string
  }
}

경우 유형 어설션을 사용할 수 있습니다.

경우에 따라서는 TypeScript보다 가치에 대해 더 잘 알게 될 수도 있습니다.일반적으로 이 문제는 일부 엔티티의 유형이 현재 유형보다 더 구체적일 수 있다는 것을 알고 있을 때 발생합니다.

타이프 어설션은 컴파일러에게 "나를 믿어, 내가 뭘 하고 있는지 알아."라고 말하는 방법입니다.유형 어설션은 다른 언어의 유형 캐스트와 비슷하지만 특별한 데이터 검사나 재구성을 수행하지 않습니다.런타임에 영향을 주지 않고 컴파일러에 의해만 사용됩니다.TypeScript는 프로그래머인 사용자가 필요한 특별한 검사를 수행했다고 가정합니다.

const nodeEnv: string = (process.env.NODE_ENV as string);
console.log(nodeEnv);

또는 env-var 등의 라이브러리가 이 특정 목적에 더 적합할 수 있습니다.

"node.displaces에 환경변수를 로드 및 삭제하기 위해 올바른 입력이 필요합니다."

. 1. 을 한다..env

# Contents of .env file
AUTHENTICATION_API_URL="http://localhost:4000/login"
GRAPHQL_API_URL="http://localhost:4000/graphql"

를 장착합니다. 로딩.env 들어가다process.envdotenv

이 합니다.dotenv에 특화된 것을 process.env이렇게 하다, , 하다, 하다라는 파일.config.ts 안에서src/다음과 같이 디렉토리와 정보를 입력합니다.

// Contents of src/config.ts

import {config as configDotenv} from 'dotenv'
import {resolve} from 'path'

switch(process.env.NODE_ENV) {
  case "development":
    console.log("Environment is 'development'")
    configDotenv({
      path: resolve(__dirname, "../.env.development")
    })
    break
  case "test":
    configDotenv({
      path: resolve(__dirname, "../.env.test")
    })
    break
  // Add 'staging' and 'production' cases here as well!
  default:
    throw new Error(`'NODE_ENV' ${process.env.NODE_ENV} is not handled!`)
}

를 들어 "를 /index.ts를 Import해야 합니다.「src/index.ts」는 「Import」라고 합니다. import './config'(다른 모든 수입품보다 우선)

하고 3을 합니다. ENV 수 env env env env envIProcessEnv

몇 후를 추가하여 선언된 " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " "" " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " "IProcessEnv 변수 합니다..env.* 아래 은 . 아래 내용도 파일 내에 저장될 수 있습니다.src/config.ts

// More content in config.ts
const throwIfNot = function<T, K extends keyof T>(obj: Partial<T>, prop: K, msg?: string): T[K] {
  if(obj[prop] === undefined || obj[prop] === null){
    throw new Error(msg || `Environment is missing variable ${prop}`)
  } else {
    return obj[prop] as T[K]
  }
}
// Validate that we have our expected ENV variables defined!
['AUTHENTICATION_API_URL', 'GRAPHQL_API_URL'].forEach(v => {
  throwIfNot(process.env, v)
})

export interface IProcessEnv {
  AUTHENTICATION_API_URL: string
  GRAPHQL_API_URL: string
}

declare global {
  namespace NodeJS {
    interface ProcessEnv extends IProcessEnv { }
  }
}
   

이것에 의해, IntelliSense/tslint 타입의 적절한 체크와 함께, 다양한 환경에의 도입시에 어느 정도의 온전함을 얻을 수 있습니다.

는 노드가 아닌 ReactJS 앱에서도 작동합니다.JS 서버 앱).스텝 (2)는 생략할 수 있습니다.이것은, 다음의 조작에 의해서 처리되기 때문입니다.create-react-app.

최신 버전의 타이프스크립트로 실행한 후:

npm install --save @types/node

하면 .process.env직접적으로.

console.log(process.env["NODE_ENV"])

를 설정했을 경우, 예상되는 결과가 표시됩니다.NODE_ENV.

가 있었던 은, 내가 하고 싶은 에서 사용하려고 하는 입니다.process.env 수입합니다.dotenv를 호출합니다.config()ㅇㅇㅇㅇ를 붙이는 마세요. 리리 、 잊잊 、 「 」!합니다..env

import dotenv from 'dotenv';

dotenv.config();

export const YOUR_ATTRIBUTE = process.env.YOUR_ATTRIBUTE!;

여기에서는 process.env 값을 문자열로 가져오거나 그렇지 않으면 오류를 발생시키는 짧은 함수를 보여 줍니다.

보다 강력한(그러나 보다 큰) 것에 대해서는, 여기 있는 다른 사람들은 env-var를 제안하고 있습니다.

/**
 * Returns value stored in environment variable with the given `name`.
 * Throws Error if no such variable or if variable undefined; thus ensuring type-safety.
 * @param name - name of variable to fetch from this process's environment.
 */
export function env(name: string): string {
  const value = process.env[name];

  if (!value) {
    throw new Error(`Missing: process.env['${name}'].`);
  }

  return value;
}

그런 다음 다음과 같은 코드를 작성할 수 있습니다.

let currentEnvironment: string;
currentEnvironment = env('NODE_ENV');

하면 왜 해야 하는지 수 에게 도움이 될 거예요.proccess.env변수가 컴파일러를 울리고 있습니다.

@types/node 설치:

npm i @types/node

env를 문자열로 포함하는 경우 다음을 수행합니다.

process.env.YOUR_ENV ?? ''

이중 물음표를 사용하면 늘/정의되지 않은지 확인할 수 있습니다.

  1. @types/node 를 를 합니다.npm i @types/node
  2. "types": [ "node" ]합니다.compilerSection★★★★★★ 。

다음은 envalid를 사용한 솔루션입니다(Node.js에서 환경변수를 검증하고 액세스합니다).

import { str, cleanEnv } from 'envalid'

const env = cleanEnv(process.env, {
  clientId: str(),
  clientSecret: str(),
})

// and now the env is validated and no longer undefined
const clientId = env.clientId

process.env 라고 입력합니다.YOUR_VAR

예:

mongoose
  .connect(String(process.env.MONGO_URL), {
    useNewUrlParser: true,
    useFindAndModify: false
  })
  .then(() => console.log('DB connected'))
  .catch((err: any) => console.error(err));

이전 응답을 보완하고 이 문제를 해결한 후 @types/node를 설치해도 이 답변을 찾을 수 있었습니다.즉, 새로고침 창을 실행합니다.

의 tsconfig를 하고 있는 는, 가 있는 경우가 ."...다만, tscript 언어 서버가 이전 버전의 tsconfig를 계속 사용하고 있는 경우는, 타입 스크립트 언어 서버를 재기동할 필요가 있는 경우가 있습니다. Code에서 Code를 실행합니다.Ctrl+Shift+P ★★★★★★★★★★★★★★★★★」Reload Window ★★★★★★★★★★★★★★★★★」TypeScript: Restart TS server능".""."".""."..."

node .env를 하는 가장 typscript "node process.env"를 하여 컴파일하는 입니다.tsc합니다.ENV var를 하십시오.) ( 저먼확 ( )tsconfig.ts것, 의 이름입니다. 이 파일을 사용하고 .dist와 「」로 합니다.index.js②) :

cd my-typescriptproject
tsc
NODE_ENV=test node ./dist/index.js

주의: 웹 앱이 있고 웹 팩을 사용하는 경우.정의할 DefinePluginprocess.env창문에 표시되는 입력은 다음과 같습니다.

declare namespace process {
    let env: {
        // this is optional, if you want to allow also
        // other values than the ones listed below, they will have type 
        // string | undefined, which is the default
        [key: string]: string
        commit_hash: string
        build_time: string
        stage: string
        version: string
        // ... etc.
    }
}

대한 이름을 Create App으로 .REACT_APP_

자세한 내용은 이쪽:https://facebook.github.io/create-react-app/docs/adding-custom-environment-variables

global.d.ts와 같은 파일을 만듭니다.


declare global {
  namespace NodeJS {
    interface ProcessEnv {
      SECRET: string;
    }
  }
}
export {};

Christian Höler의 튜토리얼

타입 가드 기능을 사용할 수도 있습니다.이와 같이 반환 타입이 있습니다.

parameterName is string

예.

function isEnvVarSpecified(envVar: string | undefined): envVar is string {
  if(envVar === undefined || envVar === null) {
    return false;
  }
  if(typeof envVar !== 'string'){
    return false;
  }
  return true;
}

이를 타입 가드라고 부를 수 있습니다.

function myFunc() {
  if(!isEnvVarSpecified(process.env.SOME_ENV_VAR')){
      throw new Error('process.env.SOME_ENV_VAR not found')
  }
  // From this point on the ts compiler won't complain about 
  // process.env.SOME_ENV_VAR being potentially undefined
}

이것을 간략화하기 위해 모듈을 작성했습니다.의존성이 없기 때문에 상당히 가볍습니다.하며, 「dotenv」를할 수 .process.envenv.from을 사용하다

몇 가지 답변에서 이미 언급되어 있지만, 예를 들어 다음과 같습니다.

실/npm을 사용하여 설치합니다.

npm install env-var --save

그런 다음 변수를 읽습니다.

import * as env from 'env-var'

// Read NODE_ENV and verify that:
// 1) it is set using the required() function
// 2) it is either 'dev' or 'prod'
// 3) throw a runtime exception if conditions #1 or #2 fail
const environment = env.get('NODE_ENV').required().asEnum(['dev', 'prod'])

// Intellisense will suggest 'dev' or 'prod'
if (environment === 'dev') {
  console.log('yep, this is dev')
} else {
  console.log('looks like this is prod')
}

또는 다음 중 하나:

import { get } from 'env-var'

// Read the GitHub token. It could be undefined
const githubToken = get('GITHUB_TOKEN').asString()

// Read MAX_CONCURRENCY, or default to 5. Throw an error if it's
// not set to a positive integer value
const concurrencyLimit = get('MAX_CONCURRENCY').default(5).asIntPositive()

function callGitApi (token: string, concurrency: number) { /* implementation */ }

// TS Error: Argument of type 'string | undefined' is not assignable to
// parameter of type 'string'.
callGitApi(githubToken, concurrencyLimit)

언급URL : https://stackoverflow.com/questions/45194598/using-process-env-in-typescript