节点 process.env 变量为空

2024-01-15

我正在构建我的第一个 Express 应用程序,它需要使用理想情况下保持安全的 API 密钥与 API 进行交互。

所以我想遵循一个基本模式,将密钥(以及任何未来的环境变量)保存在一个.gitignored .env根目录下的文件。

为了不重新发明轮子,我用了这个包 https://www.npmjs.com/package/node-env-file,并像这样设置我的环境变量,在我的app.coffee文件(应用程序的根文件):

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

That console.log将正确的密钥打印到服务器日志中。后来问题就出现了:

如果我尝试访问我的应用程序稍后加载的 JS 文件之一中的同一变量,process.env是一个空对象,所以API密钥是undefined。这不appear上面的包有问题,因为如果我在 CL 中定义变量(API_KEY=whatever npm start),行为是相同的 - 它控制台正确记录app.coffee但以后就无法使用了。

有关如何加载密钥不可用的文件的一些信息:

  • 该应用程序正在运行 React,我写给一些人.jsx文件在public/javascripts/src,并且由以下人员编译gulp into public/javascripts/build/*.js.
  • 我正在尝试访问 a 中的密钥.js文件输入public/javascripts/这是required 由其中之一.jsx files.
  • 在那个需要的.js file, process.env返回一个空对象。当我尝试访问时process.env in the .jsx文件,我实际上被告知process本身是未定义的。

有什么想法吗?我是 Express/React 新手,不清楚这在哪里process对象,我认为它是全局的并定义在npm start已定义,并且所有发生的事情env里面的信息。

谢谢!如果有任何其他信息有帮助,或者有人对如何更好地处理私人信息有任何建议,请告诉我env我的情况的信息。

EDIT:

我尝试了下面的建议,并在内部创建了一个单独的端点,它访问外部 API,然后返回响应。我已经正确地将事情串起来,以便正确响应:

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

but this(它使用单独的类向外部 API 发出请求),抛出错误:

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

从本质上讲,外部 API 响应的异步性(甚至是我忽略的数据本身)似乎造成了问题。如何访问此外部端点,然后使用传入数据响应内部请求?


后端与前端

您似乎正在尝试以错误的方式从前端位置访问后端数据。 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 一开始很令人困惑,但很快你就会克服这些小错误!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

节点 process.env 变量为空 的相关文章

随机推荐

  • 如何从 mongoose 获取 mongodb 版本

    很简单 使用 mongo cli db version 我怎样才能对猫鼬做同样的事情 如何发送自定义命令 您可以使用本机 mongodb 驱动程序Admin buildInfo http mongodb github com node mo
  • 在 R 中格式化日期,不带前导零

    有没有办法使用format日期对象上的函数 特别是类的对象POSIXlt POSIXct or Date 格式为 Y m d以便从这 3 个字段中的每一个字段中去除前导零 例如 我想format as Date 1998 09 02 Y m
  • 在 JavaScript 数组中分散数字

    我有一个数组10 数字 它们代表圆上的坐标 以度为单位 即每个数字都位于两者之间0 and 359 999999 我试图解决的问题是 当我在圆圈上绘制项目时 通过 html5 canvas api 有时它们会聚集在一起 导致项目相互绘制 因
  • 在 downloadHandler 中将使用 grid.draw() 创建的图下载为 png

    我在下载 Shiny 中 downloadHandler 函数中使用 grid draw 创建的绘图时遇到问题 这是我想要实现的目标的可重现示例 library gtable library ggplot2 ui lt shinyUI fl
  • 当值超过阈值时不同的标记颜色

    这是该情况的简化图 http postimg org image qkdm6p31p http postimg org image qkdm6p31p 我希望对高于某个阈值的值有一个红色标记 在这种情况下 红线上方的两个点有一个红色标记 在
  • 当表单具有 id='submit' 值的提交按钮时,表单提交不起作用

    While 这个jsfiddle http jsfiddle net 3at8d4b9 works
  • 警告:preg_match() [function.preg-match]:未知修饰符“/”[重复]

    这个问题在这里已经有答案了 我正在尝试使用 preg match 返回页面源代码中 中包含的所有 URL 我正在使用的代码是 preg match http code matches 我收到以下错误 Warning preg match f
  • 这是参考什么?

    假设我有这样的课程 public class class1 extends Applet implements Runnable private String s private URL u 还有第二类 class TS extends T
  • Git“NO-HEAD”声明

    我在 Eclipse 中使用 EGit 插件 但每当我将项目添加到 Git 时 该插件都会在 Eclipse 目录视图中的项目文件夹旁边放置一个 NO HEAD 指示 难道我做错了什么 这是什么意思 它可以简单地意味着 在您进行第一次添加和
  • 如何以编程方式获取sqlite中所有表的列表

    如何以编程方式获取 sqlite 中所有可用表的列表 尝试这个 SELECT FROM sqlite master where type table
  • IsEnabled 的 WPF 元素数据绑定(但为 false)

    我是 WPF 的初学者 有一些事情我似乎无法弄清楚 我有一个CheckBox我想禁用时RadioButton未选择 我当前的语法是
  • 本地网络上的 Meteor 应用

    我正在学习如何使用 Meteor 如下所示教程 https www meteor com try 我知道 Meteor 自动将应用程序托管到两者localhost和我的 IPv4 地址 在本例中 192 168 1 100 当我访问时192
  • 将联接添加到已有 select_from() 的 SQL Alchemy 表达式

    注意 这是一个关于 SQL Alchemy 表达式语言而不是 ORM 的问题 SQL Alchemy 适合向现有查询添加 WHERE 或 HAVING 子句 q select bmt gene c id select from bmt ge
  • Javascript,为什么被视为八进制

    我将 id 作为参数传递给 JavaScript 函数 因为它来自 UI 所以用零填充 但它似乎有 也许 奇怪 的行为 console log 0000020948 20948 console log 0000022115 9293 whi
  • QTableWidget::itemAt() 返回看似随机的项目

    我刚刚开始使用 Qt 所以请耐心等待 当我使用 QTableWidget gt getItemAt 时 它返回的项目与我使用 currentItemChanged 并单击同一项目时不同 我相信有必要使用 itemAt 因为我需要获取单击的任
  • 首次设置 时 FacesContext#getViewRoot() 返回 null

    我正在尝试更改一页中的 JSF 应用程序区域设置 并且这必须更改我的所有页面区域设置 我已关注此链接 效果很好JSF 中的本地化 如何记住每个会话而不是每个请求 视图选择的区域设置 https stackoverflow com quest
  • 如何在 Java 中读取也具有空值的 Excel 单元格...?

    我正在使用 Apache POI 3 6 我有一个专栏是blank 我希望能够阅读它 然后转到下一栏 即使我能解决NullPointerException问题是我无法到达下一个牢房 这是我的代码片段 HSSFCell cell row ge
  • 从 Java 程序运行 SQL 文件脚本

    我有一组 SQL 文件可以转换我的原始数据集 目前 我打开每个文件并执行它 如何执行 Java 程序中的每个文件 目标是使这个过程更加自动化 我想做类似的事情SqlScript execute myScript sql NOTE这些 SQL
  • 为什么我们不能在堆栈上分配动态内存?

    在堆栈上分配内容非常棒 因为我们有 RAII 并且不必担心内存泄漏等问题 然而有时我们必须在堆上分配 如果数据真的很大 推荐 因为堆栈很小 如果要分配的数据的大小仅在运行时才知道 动态分配 两个问题 为什么我们不能分配动态内存 即大小为 仅
  • 节点 process.env 变量为空

    我正在构建我的第一个 Express 应用程序 它需要使用理想情况下保持安全的 API 密钥与 API 进行交互 所以我想遵循一个基本模式 将密钥 以及任何未来的环境变量 保存在一个 gitignored env根目录下的文件 为了不重新发