节点 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 变量为空 的相关文章

  • jQuery AJAX 调用 Java 方法

    使用 jQuery AJAX 我们可以调用特定的 JAVA 方法 例如从 Action 类 该 Java 方法返回的数据将用于填充一些 HTML 代码 请告诉我是否可以使用 jQuery 轻松完成此操作 就像在 DWR 中一样 此外 对于
  • 使用 jQuery/JS 打开时使
    标签的内容具有动画效果

    我只想要 HTML5 的内容details标记为 滑行 动画打开 而不是仅仅弹出打开 立即出现 这可以用 jQuery Javascript 实现吗 Fiddle http jsfiddle net 9h4Hq HTML
  • 如何抑制窗口鼠标滚轮滚动...?

    我正在开发嵌入页面中的画布应用程序 我有它 因此您可以使用鼠标滚轮放大绘图 但不幸的是 这会滚动页面 因为它是文章的一部分 当我在 dom 元素上滚动鼠标滚轮时 是否可以阻止鼠标滚轮在窗口上滚动 附加鼠标滚轮 不是 Gecko DOMMou
  • Node.js:如何在检索数据(块)时关闭响应/请求

    我正在用 node js 构建一个应用程序 它加载多个页面并分析内容 因为 node js 发送块 所以我可以分析这些块 如果一个块包含例如索引 nofollow 我想关闭该连接并继续其余部分 var host example com to
  • 使用node.js安装xml2json时出错

    我尝试为 node js 安装 xml2json 包 但它给了我错误 Error are as below 我的系统配置如下 Node js 版本 v5 4 1 npm 版本 3 3 12 操作系统 Windows 10 64 位 pyth
  • 从未用 @flow 标记的导入文件中获取类型定义

    TL DR我怎么告诉flow从未声明的导入模块导入类型定义 flow 加长版 流接缝能够从不使用流语法的文件中派生类型 请参阅示例 示例文件 flow js if Math random lt 0 5 var y hello else va
  • 音频 blob 的 URL.createObjectURL 在 Firefox 中给出 TypeError

    我正在尝试从创建的音频 blob 创建对象 URLgetUserMedia 该代码在 Chrome 中可以运行 但在 Firefox 中存在问题 错误 当我打电话时stopAudioRecorder 它停在audio player src
  • React - 无法读取未定义的属性[重复]

    这个问题在这里已经有答案了 通常 当我单击子组件中的菜单项时 它会调用 this handlesort 这是一个本地函数 处理排序从我的父组件中获取 onReorder 属性 onReorder 调用名为 reOrder 的本地函数 它设置
  • MVC 在布局代码之前执行视图代码并破坏我的脚本顺序

    我正在尝试将所有 javascript 包含内容移至页面底部 我正在将 MVC 与 Razor 一起使用 我编写了一个辅助方法来注册脚本 它按注册顺序保留脚本 并排除重复的内容 Html RegisterScript scripts som
  • 跟踪用户何时点击浏览器上的后退按钮

    是否可以检测用户何时单击浏览器的后退按钮 我有一个 Ajax 应用程序 如果我可以检测到用户何时单击后退按钮 我可以显示适当的数据 任何使用 PHP JavaScript 的解决方案都是优选的 任何语言的解决方案都可以 只需要我可以翻译成
  • 通过 CDN 使用 Dojo 时如何加载自定义 AMD 模块?

    我正在使用 google 的 CDN 并尝试使用他们的加载程序加载我自己的 AMD 模块 我知道我做错了什么 但我被困住了 有任何想法吗
  • Firefox 书签探索未超过 Javascript 的第一级

    我已经编写了一些代码来探索我的 Firefox 书签 但我只获得了第一级书签 即我没有获得文件夹中的链接 e g 搜索引擎 雅虎网站 谷歌网站 在此示例中 我只能访问 Search engines 和 google com 不能访问 yah
  • Angular 2+ 安全性;保护服务器上的延迟加载模块

    我有一个 Angular 2 应用程序 用户可以在其中输入个人数据 该数据在应用程序的另一部分进行分析 该部分仅适用于具有特定权限的人员 问题是我们不想让未经授权的人知道how我们正在分析这些数据 因此 如果他们能够在应用程序中查看模板 那
  • Javascript 数组到 VBScript

    我有一个使用 Javascript 构建的对象数组 我需要使用 VBScript 读取它 如下例所示 我找不到在 VbScript 代码中循环遍历数组的方法myArray object 这个例子是我的问题的简化 我无法更改页面的默认语言 这
  • 如何使用tampermonkey模拟react应用程序中的点击?

    我正在尝试使用 Tampermonkey 脚本模拟对 React 元素的点击 不幸的是 由于 React 有自己的影子 DOM 所以天真的方法使用document querySelector 不工作 我遇到了一些需要修改 React 组件本
  • Laravel 中只向登录用户显示按钮

    如果我以 John 身份登录 如何才能只显示 John 的红色按钮而不显示 Susan 的红色按钮 测试系统环境 Win10 Laravel5 4 Mysql5 7 19 table class table table responsive
  • HTML 离线应用程序缓存,列出下载的文件

    作为我正在构建的离线 Web 应用程序的加载屏幕的一部分 使用缓存清单 http developer apple com library safari documentation iPhone Conceptual SafariJSData
  • Javascript 纪元时间(以天为单位)

    我需要以天为单位的纪元时间 迄今为止 我已经看到过有关如何翻译它的帖子 但几天后就没有了 我对纪元时间很不好 我怎么能得到这个 我需要以天为单位的纪元时间 我将解释为您想要自纪元以来的天数 纪元本身是第 0 天 或第 1 天的开始 无论您如
  • Mongoose - 查询从多个集合中获取数据

    我想要获取猫鼬的查询在 Node js 应用程序中 如下所述输出 user js comment js 和 post js 是我使用的模型文件 user js var mongoose require mongoose var Schema
  • 如何在 Swiper 实例之外使用 useSwiper?

    我在用着用于 React 的滑动器 https swiperjs com react显示一些幻灯片 我一直坚持使用外部按钮在幻灯片 上一张和下一张 之间导航 刷卡器有一个useSwiper hook https swiperjs com r

随机推荐

  • 如何从 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根目录下的文件 为了不重新发