如何使用 Netlify Lambda 函数隐藏 API 密钥

2023-12-30

我正在使用 vanilla JS 构建一个简单的应用程序,在其中检索用户的位置并将坐标传递给 Google 的地理定位 API。我试图通过 Netlify 的 UI 将 API 密钥设置为环境变量来访问 API 密钥,但我不太清楚如何实现 lambda 函数来完成该任务。

我有一个函数可以获取用户的纬度/经度,并在将数据显示在 DOM 中之前从地理位置 API 中获取数据。截至目前,我只有一个index.html 和app.js 文件。

getUserLocation();

function getUserLocation() {
  async function success(position) {
    const latitude = position.coords.latitude;
    const longitude = position.coords.longitude;
    const geoAPI = `https://maps.googleapis.com/maps/api/geocode/json?latlng=${latitude},${longitude}&key=${apiKey}`;

    const { city, state, country } = await getGeoData(geoAPI);

    updateWidget({ city, state, country });
  }

  function error() {
    alert("Unable to retrieve your location");
  }

  if (!navigator.geolocation) {
    console.log("Geolocation is not supported by your browser");
  } else {
    navigator.geolocation.getCurrentPosition(success, error);
  }
}

我尝试阅读 Netlify 的文档,但我不确定如何在我的简单项目中实现该解决方案。任何帮助深表感谢!


由于密钥是秘密密钥,我们将创建一个 Netlify 函数来进行 api 调用https://maps.googleapis.com/maps/api/geocode/json终点将是/.netlify/functions/location在我们的网站上。

对于这个例子,我们将not使用节点工具创建构建包,因此我们将包含我们的依赖模块node-fetch与我们的功能。

在 Netlify 管理控制台上添加秘密 api 密钥

将秘密 api 密钥添加到站点上的环境变量中的变量中MAP_GOOGLEAPIS_KEY

存储库项目结构

netlify.toml文件(构建配置):

我们实际上并没有进行任何构建,但这将帮助我们在 Netlify 上配置部署容器,以了解我们的函数所在的位置。

[build]
  functions = "functions"
  publish = "site"
  command = "echo 'No build here yet!'"

The functions/location/location.js功能码

const fetch = require('node-fetch');

const apiKey = process.env.MAP_GOOGLEAPIS_KEY;

exports.handler = async function(event, context) {
  try {
    const { latitude, longitude } = event.queryStringParameters || {};
    if (!latitude || !longitude) {
      return { statusCode: 400, body: "Missing query parameters" };
    }
    const uri = `https://maps.googleapis.com/maps/api/geocode/json?latlng=${latitude},${longitude}`;

    const response = await fetch(`${uri}&key=${apiKey}`);
    if (!response.ok) {
      // NOT res.status >= 200 && res.status < 300
      return { statusCode: response.status, body: response.statusText };
    }

    const data = await response.json();

    return {
      statusCode: 200,
      headers: { "content-type": "application/json" },
      body: JSON.stringify(data)
    };
  } catch (err) {
    console.log("invocation error:", err); // output to netlify function log
    return {
      statusCode: 500,
      body: err.message // Could be a custom message or object i.e. JSON.stringify(err)
    };
  }
};

我们的客户端脚本的新端点调用

客户端上没有密钥!

function getUserLocation() {
  async function success(position) {
    const latitude = position.coords.latitude;
    const longitude = position.coords.longitude;
    const geoAPI = `/.netlify/functions/location?latitude=${latitude}&longitude=${longitude}`;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 Netlify Lambda 函数隐藏 API 密钥 的相关文章

  • 如何检测浏览器是否支持自定义元素

    我正在查看 Modernizr 它应该有助于功能检测 这应该可以帮助确定您的网站是否与给定的 Web 浏览器兼容 但我没有看到任何表明我可以使用它来检测自定义 HTML 的内容我们在内容中创建和定义的元素 如果不是 Modernizr 我如
  • 在 javascript/jquery 中将光标更改为等待

    当调用函数时 如何让光标更改为此加载图标以及如何将其更改回 javascript jquery 中的普通光标 在你的 jQuery 中使用 body css cursor progress 然后又恢复正常 body css cursor d
  • 关闭选项卡时要求确认[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 当我在某些浏览器上关闭页面时 我希望出现一个消息框 并询问我是否真的要关闭页面 有两个按钮 如果我单击No那么这个标签就不会被关闭 我怎样
  • Web 串行 API - 未捕获(承诺中)DOMException:无法打开串行端口/所需成员 baudRate 未定义

    下面的代码可以在我的 Xubuntu 机器上运行 但现在我在 Kubuntu 上 它不再工作了 它不会打开端口 Arduino IDE 工作正常 可以向开发板写入代码 并且我可以在 Chrome 中选择设备 Arduino Uno 但当我尝
  • 在 Vue.js 中从父组件执行子方法

    目前 我有一个 Vue js 组件 其中包含其他组件的列表 我知道使用 vue 的常见方式是将数据传递给孩子 并从孩子向父母发出事件 但是 在这种情况下 我想在子组件中的按钮出现时执行子组件中的方法 parent被点击 哪种方法最好 一种建
  • 我想检查 $('#td1').text() === "x" 是否?

    我想检查innerHtml是否有X或O 所以我不能再次添加任何其他东西 但它不起作用 添加检查代码后它就停止了 我在这里尝试做一个简单的XO游戏来更熟悉javascript和jquery 我也不确定是否可以用 jQuery 做到这一点
  • 检查 JavaScript 字符串是否为 URL

    JavaScript 有没有办法检查字符串是否是 URL 正则表达式被排除在外 因为 URL 很可能是这样写的stackoverflow 也就是说它可能没有 com www or http 如果你想检查一个字符串是否是有效的 HTTP UR
  • Google App Engine:修改云运行环境

    我正在尝试部署一个使用自定义 Node js 服务器的 Next js 应用程序 我想将自定义构建变量注入应用程序 next config js const NODE ENV process env NODE ENV const envTy
  • Node.js:如何在检索数据(块)时关闭响应/请求

    我正在用 node js 构建一个应用程序 它加载多个页面并分析内容 因为 node js 发送块 所以我可以分析这些块 如果一个块包含例如索引 nofollow 我想关闭该连接并继续其余部分 var host example com to
  • Jquery/Javascript 上传和下载文件,无需后端

    是否可以在没有后端服务器的情况下在 JavaScript 函数中下载和上传文件 我需要导出和导入由 JavaScript 函数生成的 XML 我想创建按钮 保存 xml 来保存文件 但我不知道是否可行 另一方面 我希望将 XML 文件直接上
  • 使用 KnockoutJs 映射插件进行递归模板化

    我正在尝试使用以下方法在树上进行递归模板化ko映射 插入 http knockoutjs com documentation plugins mapping html 但我无法渲染它 除非我定义separate每个级别的模板 在以下情况下
  • 在javascript中解析json - 长数字被四舍五入

    我需要解析一个包含长数字的 json 在 java servlet 中生成 问题是长数字被四舍五入 当执行这段代码时 var s x 6855337641038665531 var obj JSON parse s alert obj x
  • FireFox 中的自动滚动

    我的应用程序是实时聊天 我有一个 Div 来包装消息 每条消息都是一个 div 所以 在几条消息之后 我的 DOM 看起来像这样 div div Message number two div div div div
  • 模块构建失败(来自 ./node_modules/babel-loader/lib/index.js)Vue Js

    我从 GitHub 下载了一个我和我的朋友正在开发的项目 但是当我尝试运行时 npm run serve 我收到这个错误 src main js 中的错误 Module build failed from node modules babe
  • 为什么我不能在 AngularJS 中使用 data-* 作为指令的属性名称?

    On the t他的笨蛋 http plnkr co edit l3KoY3 p preview您可以注意到属性名称模式的奇怪行为data 在指令中 电话 Test of data named attribute br
  • 有没有办法阻止 prettier / prettier-now 将函数参数分解为新行

    当使用 prettier prettier now 在保存时进行格式化时 当一个函数包装另一个函数时 它会中断到一个新行 我想知道是否有办法阻止这种行为 例如 期望的输出 app get campgrounds id catchAsync
  • Javascript转换时区问题

    我在转换当前时区的日期时间时遇到问题 我从服务器收到此日期字符串 格式为 2015 10 09T08 00 00 这是中部时间 但是当我使用 GMT 5 中的 new Date strDate 转换此日期时间时 它返回给我的信息如下 这是不
  • Javascript 纪元时间(以天为单位)

    我需要以天为单位的纪元时间 迄今为止 我已经看到过有关如何翻译它的帖子 但几天后就没有了 我对纪元时间很不好 我怎么能得到这个 我需要以天为单位的纪元时间 我将解释为您想要自纪元以来的天数 纪元本身是第 0 天 或第 1 天的开始 无论您如
  • 在 React.js 中编辑丰富的数据结构

    我正在尝试为数据结构创建一个简单的基于网格的编辑器 但我在使用 React js 时遇到了一些概念问题 他们的文档对此没有太大帮助 所以我希望这里有人可以提供帮助 首先 将状态从外部组件传输到内部组件的正确方法是什么 是否有可能将内部组件中
  • fullCalendar 未显示正确的结束日期

    我正在看调试页面 http jsbin com wukofacaxu edit js outputFullCalendar 官方网站的 我想安排一个活动时间为 22 09 2015 至 30 09 2015 dd mm yyyy 但它只显示

随机推荐

  • 无法将 R 数据帧转换为 Spark DataFrame

    当我尝试使用以下方法将 R 中的本地数据帧转换为 Spark DataFrame 时 raw data lt as DataFrame sc raw data 我收到此错误 17 01 24 08 02 04 警告 RBackendHand
  • 如何禁用 OpenCV 相机中的缓冲区?

    我遇到过这种情况 我使用 OpenCV 来检测相机前面的人脸 并对这些人脸进行一些机器学习 我遇到的问题是 一旦我完成所有处理 并去抓取下一帧 我得到的是过去 而不是现在 意思是 我将读取缓冲区内的内容 而不是实际在相机前面的内容 由于我不
  • 在 C# 中克隆 VSTS 构建定义

    我正在使用 BuildHttpClient 的 GetDefinitionAsync 和 CreateDefinitionAsync 来克隆 VSTS 构建定义 这工作正常 但我想在项目的根文件夹之外的不同文件夹中创建构建定义 我可以通过
  • iOS 圆形渐变

    我的任务是用圆形渐变绘制线条 颜色应按圆圈变化 然后添加动画 现在我画了360层 有一定的间隔和不同的颜色 var colours UIColor UIColor var startAngle CGFloat 0 5 Double pi v
  • 无法从正文 onload 调用函数(未捕获的引用错误:未定义启动)javascript

    我有一个 body onload 调用 javascript 中的函数 我已经尝试了很多方法 但控制台只是打印到错误日志 未捕获的引用错误 未定义启动 我认为这可能是一个故障 如果它对您有用 请通知我 我的代码如下
  • 在控制器内创建会话 cookie

    我是 Tomcat servlet 和 Spring Web 的新手 我有 PHP 背景 所以至少可以说我有点迷失方向 我想要一个控制器为我创建一个会话 cookie 有人告诉我 我可以在标准 servlet 中获得这样的会话 protec
  • 下拉菜单:如何停用第一个(选定)选项?

    这是我正在使用的下拉菜单
  • 如何更改 Jenkins 中的 JAR 构建路径?

    我正在通过 Jenkins 构建一个 Java 项目 JAR 正在 C Windows System32 config systemprofile m2 repository com other 文件夹中创建 在 Jenkins 中执行 m
  • WriteConsoleOutputCharacter 导致控制台应用程序崩溃

    当尝试使用写入控制台输出字符 https learn microsoft com en us windows console writeconsoleoutputcharacter函数 应用程序崩溃 COORD pos pos X 0 po
  • 使用 boost::asio::read_async 读取 Protobuf 对象

    我正在使用 Boost asio 编写一个应用程序 其中客户端和服务器交换使用 google proto buffers 序列化的消息 我不知道通过网络发送的序列化消息的大小是多少 proto buf 对象似乎没有任何分隔符 以下是 pro
  • 从单独的类访问 JPanel 组件

    所以我想要一个在菜单页面和主应用程序页面之间切换的 CardLayout 类 但我想在它们自己的类中设计这两个面板 然后在不同的类中添加 ActionListener 和 CardLayout 并让 ActionListener 使用在面板
  • 分配给c中结构体中的数组

    我有以下代码 typedef struct Test long mem 1000 Test extern Test test int main Test test Test malloc sizeof Test test gt mem 0
  • 将页眉和页脚添加到多页Word文档VBA

    我正在尝试通过宏向Word文档的每一页添加页眉和页脚 我尝试了几种不同的方法 例如迭代页面上的每个形状 但在这种情况下 页眉和页脚会在每个页面上打印多次 具体取决于文档中的形状数量 目前 我的代码正在查找任何当前的页眉和页脚并删除它们 然后
  • nginx auth_basic“受限”提示每个请求登录

    我已经设置了一个简单的 nginx 服务器 将位置块配置为指向我想要服务的相应目录 并使用 auth basic 模块设置基本身份验证 然而 我的服务器在位置块下的每个页面请求上请求用户名 密码凭据 即使多次将它们提供给位置块下的不同页面
  • 获取 ARM 中逻辑应用的回调 url

    我正在部署一个 ARM 模板 其中包括 天蓝色函数 逻辑应用程序 下列的link https github com MicrosoftDocs azure docs blob master articles logic apps logic
  • 使用来自 WSL 的 numpy 安装 MKL 时引发 RuntimeError(f'Cannot parse version {FULLVERSION}')

    我尝试在 Windows 子系统 Linux 中将 MKL 与 numpy 链接https www intel com content www us en developer articles technical build numpy w
  • 有没有办法找到套接字对等进程的pid?

    我有以下案例 iOS 上的两个应用程序 我的和第三方 需要通过 TCP IP 进行通信 我可以更改我的应用程序的代码 但不能更改第 3 方应用程序的代码 协议无法更改 因为我无法更改第 3 方应用程序 在我的应用程序中 我想确保与正确的应用
  • 为什么 JavaScript 中匹配的子字符串返回“undefined”?

    我今天在 JavaScript 中执行一些正则表达式时遇到了一个奇怪的行为 Windows Vista 上的 Firefox 3 var str format A var format s format s exec str console
  • SQL 一次创建多个表

    我需要一次创建多个表 我很难找出完成此任务的正确方法 目前我的脚本如下所示 private function buildDB sql lt lt
  • 如何使用 Netlify Lambda 函数隐藏 API 密钥

    我正在使用 vanilla JS 构建一个简单的应用程序 在其中检索用户的位置并将坐标传递给 Google 的地理定位 API 我试图通过 Netlify 的 UI 将 API 密钥设置为环境变量来访问 API 密钥 但我不太清楚如何实现