Переменные узла process.env пустые
Я создаю свое первое приложение Express, которое должно взаимодействовать с API, используя ключ API, который в идеале остается безопасным.
Поэтому я хотел следовать базовому шаблону хранения ключа (и любых будущих переменных среды) в .gitignore
d .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 пользователю.