Проблема с чтением файла .env в проекте javascript

Я использую файл .env для хранения ключа API. Однако я не могу заставить свой базовый файл JavaScript читать файл .env. Я установил пакет dotenv npm, но, похоже, он не работает, и я не уверен, что происходит.

Я убедился, что мой .env находится в корне моего проекта. См. Картинку ниже:

введите описание изображения здесь

Я также установил последнюю версию dotenv.

Это код в fixer-service.js, который пытается получить доступ к файлу .env:

require("dotenv").config();
const axios = require("axios");

const symbols = process.env.SYMBOLS || "EUR,USD,GBP";

const api = axios.create({
  baseURL: "http://data.fixer.io/api",
  params: {
    access_key: process.env.API_KEY
  },
  timeout: process.env.TIMEOUT || 5000
});

И это код в server.js, который пытается получить доступ к файлу .env:

require("dotenv").config();
const { getRates } = require("./lib/fixer-service");

// read .env files

const express = require("express");

const app = express();
const port = process.env.PORT || 3000;

И это код в файле .env (я удалил API-ключ):

API_KEY=api-key
PORT=3000
TIMEOUT=5000
SYMBOLS=EUR,USD,GBP,AUD,BTC,KES,JPY,CNY

Когда я пытался запустить свой сервер разработки, я получаю следующее сообщение об ошибке:

(node:9045) UnhandledPromiseRejectionWarning: Error: missing_access_key
    at get (/Users/selina/Desktop/single-page-application/lib/fixer-service.js:22:9)
    at process._tickCallback (internal/process/next_tick.js:68:7)
(node:9045) UnhandledPromiseRejectionWarning: Unhandled promise rejection.
    This error originated either by throwing inside of an async
    function without a catch block, or by rejecting a promise which was
    not handled with .catch(). (rejection id: 1)```

person Selina Beasley    schedule 09.08.2019    source источник
comment
Вы пробовали указать полный путь к вашему .env файлу и посмотреть, работает ли это? require('dotenv').config({ path: full/path/here }) - Я бы предложил использовать что-то вроде path.join(__dirname, '...') для получения полного пути   -  person goto1    schedule 10.08.2019
comment
Да, я пытался указать полный путь, но все равно не работает.   -  person Selina Beasley    schedule 10.08.2019
comment
Можете ли вы обновить свой вопрос с помощью структуры вашего проекта / папок и вашего .env файла (не раскрывая, конечно, API_KEY   -  person goto1    schedule 10.08.2019
comment
И этот код находится внутри server.js, и вы запускаете свой код, выполняя node server.js?   -  person goto1    schedule 10.08.2019
comment
Я добавил в свой вопрос дополнительную информацию.   -  person Selina Beasley    schedule 10.08.2019
comment
Его работа, а не установка, в документации есть пример для отладки того, что загружается, npmjs.com / package / dotenv # config - и проверьте, что файл сохранен как unix, а не dos, т.е. LF, а не CR \ LF   -  person Lawrence Cherone    schedule 10.08.2019
comment
dotenv вернет ошибку, если не сможет найти ваш .env файл или что-то еще пойдет не так. включение debug также покажет вам построчную информацию о том, что происходит. const { error } = require('dotenv').config({ debug: true }); console.error(error)   -  person maxbeatty    schedule 10.08.2019
comment
@SelinaBeasley Я не могу заставить его воспроизвести с кодом, который вы указали, если что-то не пропало ... Похоже, ошибка, которую вы получаете, связана с какой-то другой проблемой, которая не включена в ваш текущий код; вы используете api, вызывая его внутри getRates, так что, возможно, там что-то не так ... Но эта настройка должна работать - imgur.com/a/Ddzu2oV. Кроме того, вам не нужно делать require('dotenv').config() везде, где вы пытаетесь прочитать process.env переменные. Просто сделайте это один раз в своем входном файле - в вашем случае это файл server.js (см. Мой пример)   -  person goto1    schedule 10.08.2019


Ответы (1)


Я нашел решение, но у меня нет четкого объяснения, почему оно работает! Был бы признателен, если бы кто-нибудь еще взвесил, чтобы объяснить.

Перемещение параметров с axios.create() на api.get() работает:

const api = axios.create({
  baseURL: 'http://data.fixer.io/api/',
  timeout: process.env.TIMEOUT || 5000
});

const get = async url => {
  const response = await api.get(url, {
    params: { access_key: process.env.API_KEY }
  });
  const { data } = response;
  if (data.success) {
    return data;
  }
  throw new Error(data.error.type);
};

person Dave B.    schedule 25.08.2019