Переменные узла process.env пустые

Я создаю свое первое приложение Express, которое должно взаимодействовать с API, используя ключ API, который в идеале остается безопасным.

Поэтому я хотел следовать базовому шаблону хранения ключа (и любых будущих переменных среды) в .gitignored .env файл в корневом каталоге.

Чтобы не изобретать велосипед, я использовал этот пакет и установил переменные env следующим образом: app.coffee файл (корневой файл приложения):

env = require('node-env-file')
env __dirname + '/.env'
console.log process.env.MY_API_KEY

Тот console.log распечатывает правильный ключ к журналам сервера. Проблема возникает позже:

Если я пытаюсь получить доступ к той же переменной в одном из файлов JS, загруженных позже моим приложением, process.env является пустым объектом, поэтому ключ API undefined, Похоже, что это не проблема с вышеуказанным пакетом, потому что если я определю переменную в CL (API_KEY=whatever npm start), поведение то же самое - консоль логирует правильно из app.coffee но недоступно позже.

Некоторая информация о том, как загружаются файлы, в которых недоступен ключ:

  • Приложение работает под управлением React, о котором я пишу нескольким .jsx файлы в public/javascripts/srcи которые составлены gulp в public/javascripts/build/*.js,
  • Я пытаюсь получить доступ к ключу в .js файл в public/javascripts/ который requireд одним из .jsx файлы.
  • Во что требуется .js файл, process.env возвращает пустой объект. Когда я пытаюсь получить доступ process.env в .jsx файлы, мне на самом деле сказали, что process Сам не определен.

Есть идеи, что здесь происходит? Я новичок в экспресс / реакции, и неясно, где это process объект, который я думал, был глобальным и определен на npm start определяется, и что происходит со всеми env информация в нем.

Спасибо! Пожалуйста, дайте мне знать, если любая другая информация будет полезна, или если у кого-то есть какие-либо предложения о том, как лучше обращаться с частным env Информация в моей ситуации.

РЕДАКТИРОВАТЬ:

Я попробовал приведенные ниже предложения и создал отдельную конечную точку для внутреннего использования, которая обращается к внешнему API и затем возвращает ответ. Я исправил вещи правильно, так что это отвечает правильно:

router.get '/images', (req, res, next) ->
  res.json({ some: 'json' });

но это (который использует отдельный класс, чтобы сделать запрос к внешнему API), выдает ошибку:

router.get '/images', (req, res, next) ->
  new Images('nature').fetch (images) ->
    res.json({ some: 'json' })

По сути, это выглядит как асинхронность ответа от внешнего API (и даже не сами данные, которые я проигнорировал), создает проблему. Как мне подключиться к этой внешней конечной точке, а затем ответить на внутренний запрос входящими данными?

2 ответа

Решение

Бэк-энд против Фронт-энда

Похоже, что вы пытаетесь получить доступ к внутренним данным из внешнего интерфейса неверным способом. Огромная сила Node.js заключается в том, что JavaScript спереди и сзади, но в начале довольно сложно понять, с какой стороны выполняется каждый скрипт.

В проекте Express все файлы Javascript, которые отправляются на внешний интерфейс, те, которые будут напрямую взаимодействовать со страницей клиента, расположены в public/javascripts/, Как правило, в некоторых из этих файлов есть функции AJAX для обмена данными и связи с серверной частью.

Эти внутренние файлы расположены повсюду: в корневом каталоге, в routes/и все остальные папки, которые вы создаете. Эти файлы в значительной степени связаны с вашим экземпляром Node и, следовательно, могут связываться друг с другом с помощью глобальных объектов, таких как process например.

Ваш сценарий в public/javascripts/, который выполняется на компьютере клиента, пытается напрямую получить доступ к переменной, расположенной на сервере, на котором работает ваш экземпляр Node: именно поэтому ваш код не работает. Если вы хотите получить доступ к данным из внутреннего интерфейса, вы должны использовать вызовы AJAX во внешнем интерфейсе.

Server   <---(AJAX only)---   Client
------                        ------
app.js                        public/javascripts/script.js
routes.js
...

При этом вы хотели сохранить свой ключ API закрытым, что не произойдет, если вы отправите его каждому клиенту, который находится на этой конкретной странице. То, что вы должны сделать, это сделать звонок с сервера, используя xhr модуль, а затем доставить данные во внешний интерфейс без секретного ключа API.

Надеюсь, я был ясен, поначалу Node довольно запутан, но очень скоро вы преодолеете эти маленькие ошибки!

Все.jsx - это какой-то код, важно то, где код выполняется. process.env переменная, которая доступна во время выполнения Node.js. Когда ваш.jsx-код переносится в.js и подается в браузер, process.env Переменная больше не будет существовать. Если вы выполняете вызов API внутри браузера, ключ API будет в основном доступен для клиента. Если вы хотите защитить ключ, вы должны сделать так, чтобы ваш сервер Node.js выставлял маршрут API, который попадет в ваше приложение React. Затем этот сервер Node.js выполнит вызов внешней службы, используя ключ API. Поскольку этот вызов выполняется сервером, process.env будет доступен и останется скрытым от клиента. Затем вы можете переслать результат обратного вызова API пользователю.

Другие вопросы по тегам