node.js - menggunakan process.env di TypeScript


Bagaimana cara membaca variabel lingkungan node di TypeScript?

Jika saya menggunakan process.env.NODE_ENV saya mendapat kesalahan ini :

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

Saya telah menginstal @types/node tetapi itu tidak membantu.

Jawaban #1

Setelah Anda menginstal @types/node di proyek Anda, Anda dapat memberitahu TypeScript dengan tepat variabel apa saja yang ada di process.env Anda:

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 {}

Penggunaan :

process.env.GITHUB_AUTH_TOKEN; // $ExpectType string

Metode ini akan memberi Anda IntelliSense, dan juga memanfaatkan tipe literal string.

Catatan: cuplikan di atas adalah peningkatan modul. Berkas yang mengandung peningkatan modul haruslah modul (bukan skrip). Perbedaan antara modul dan skrip adalah modul memiliki setidaknya satu pernyataan impor/ekspor.

Agar TypeScript memperlakukan file Anda sebagai modul, cukup tambahkan satu pernyataan import ke dalamnya. Bisa apa saja. Bahkan export {} juga bisa.

Jawaban #2

Tidak ada jaminan tentang variabel lingkungan apa (jika ada) yang akan tersedia dalam proses Node - variabel NODE_ENV hanyalah sebuah konvensi yang dipopulerkan oleh Express, bukan sesuatu yang dibangun dalam Node itu sendiri. Oleh karena itu, tidak masuk akal jika itu dimasukkan dalam definisi tipe. Sebagai gantinya, mereka mendefinisikan process.env seperti ini:

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

Yang artinya process.env dapat diindeks dengan string untuk mendapatkan string kembali (atau undefined, jika variabel tidak diatur). Untuk memperbaiki kesalahan Anda, Anda harus menggunakan sintaks indeks:

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

Sebagai alternatif, seperti yang dikemukakan jcalz dalam komentar, jika Anda menggunakan TypeScript 2.2 atau versi lebih baru, Anda dapat mengakses tipe yang dapat diindeks seperti yang didefinisikan di atas menggunakan sintaks titik - dalam hal ini, kode Anda seharusnya langsung berfungsi apa adanya.

Jawaban #3

cukup tambahkan sebelum digunakan process.env.NODE_ENV ikuti baris berikut:

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

Jawaban #4

Anda dapat menggunakan Type Assertion untuk ini

Terkadang Anda akan berada dalam situasi di mana Anda mengetahui lebih banyak tentang suatu nilai daripada TypeScript. Biasanya ini akan terjadi ketika Anda tahu bahwa tipe suatu entitas bisa lebih spesifik daripada tipe saat ini.

Pernyataan tipe adalah cara untuk memberi tahu kompilator "percayalah padaku, aku tahu apa yang sedang kulakukan." Pernyataan tipe mirip dengan konversi tipe dalam bahasa lain, tetapi tidak melakukan pengecekan khusus atau restrukturisasi data. Ini tidak memiliki dampak pada waktu eksekusi, dan digunakan murni oleh kompilator. TypeScript mengasumsikan bahwa Anda, sebagai pemrogram, telah melakukan semua pengecekan khusus yang diperlukan.

Contoh

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

Sebagai alternatif, Anda mungkin akan menemukan pustaka seperti env-var lebih cocok untuk tujuan khusus ini --

solusi untuk memuat dan membersihkan variabel lingkungan di node.js dengan pengetikan yang benar

Jawaban #5

1. Buat file .env

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

2. Muat file .env Anda ke dalam process.env dengan dotenv

Kita dapat memanfaatkan dotenv untuk mengatur variabel process.env spesifik lingkungan. Buat file bernama config.ts di direktori src/ Anda dan isi seperti berikut:

// 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!`)
}

Catatan: File ini perlu diimpor di file teratas Anda, kemungkinan src/index.ts Anda melalui import './config' (diletakkan sebelum semua impor lainnya)

3. Periksa variabel ENV dan definisikan IProcessEnv

Setelah menggabungkan beberapa metode di atas, kita dapat menambahkan beberapa pemeriksaan runtime untuk memastikan agar menjamin bahwa antarmuka IProcessEnv yang kita deklarasikan mencerminkan variabel ENV apa yang disetel dalam file .env.* kita. Konten di bawah ini juga dapat ditempatkan di 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 { }
  }
}
   

Ini akan memberi kita pemeriksaan tipe IntelliSense/tslint yang tepat, serta beberapa ketenangan pikiran saat menyebarkan ke berbagai lingkungan.

Catatan bahwa ini juga berlaku untuk aplikasi ReactJS (berbeda dengan aplikasi server NodeJS). Anda dapat mengabaikan Langkah (2) karena ini ditangani oleh create-react-app.

Jawaban #6

Setelah menjalankan dengan versi terbaru typescript:

npm install -D --save @types/node

Anda dapat menggunakan process.env secara langsung.

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

Anda akan melihat hasil yang diharapkan jika Anda telah mengatur NODE_ENV.

Jawaban #7

yang berhasil untuk saya adalah setiap kali saya ingin menggunakan process.env saya pertama-tama mengimpor dotenv dan memanggil config() padanya. Juga, ingat untuk menambahkan ! di akhir dan pastikan atribut tersebut didefinisikan dalam file .env Anda

import dotenv from 'dotenv';

dotenv.config();

export const YOUR_ATTRIBUTE = process.env.YOUR_ATTRIBUTE!;

Jawaban #8

Berikut adalah fungsi singkat yang dijamin akan mengambil nilai process.env sebagai string -- atau akan menimbulkan kesalahan jika tidak demikian.

Untuk sesuatu yang lebih kuat (tapi juga lebih besar), orang lain di sini telah menyarankan 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;
}

Anda seharusnya kemudian bisa menulis kode seperti:

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

Jawaban #9

Saya tahu ini akan membantu seseorang yang mencari ini dan tidak bisa menemukan jawaban sederhana mengapa variabel process.env Anda membuat compiler Anda mengeluh:

Pasang @types/node:

npm i @types/node

Lalu di mana pun Anda menyertakan env Anda sebagai string, lakukan ini:

process.env.YOUR_ENV ?? ''

Tanda tanya ganda memungkinkan Anda untuk memeriksa null/undefined.

Jawaban #10

buat file seperti global.d.ts

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

tutorial oleh Christian Höller

Artikel terkait