【问题标题】:How can I create a Netlify CMS collection file upon the submission of a Netlify Form?如何在提交 Netlify 表单后创建 Netlify CMS 集合文件?
【发布时间】:2019-08-22 02:35:33
【问题描述】:

我目前有一个 GatsbyJS 应用程序,它使用 Netlify CMS (NCMS) 进行内容管理,并通过 GitHub 使用 Netlify 进行托管/部署。

我想构建一个非常简单的订单系统,但我想使用 JSON 文件和 NCMS 集合来表示数据,因为我的数据要求非常低,并且我希望能够完全管理数据通过 NCMS。

例如,我有一个Products 集合和一个Orders 集合。 Products 使用 JSON 扩展并包含代表每个产品的 JSON 文件。那里的一切看起来都很好。对于Orders,我希望能够从 NCMS 或从我的应用程序中的订单创建新条目。

在 NCMS 中创建 Orders 条目应该足够简单,使用关系小部件将 Products 条目合并到每个订单中。我想弄清楚的是如何在提交表单时在我的文件系统(repo)中创建 JSON 文件。我认为这在某种程度上可以通过 GitHub webhooks 实现,因为当您在其系统中创建文件时,NCMS 正在执行此操作。

当用户在我的应用程序中提交 Netlify 表单时,我可以使用 Netlify 的表单 API、Netlify 函数和/或 GitHub webhook 的某种组合在我的 GitHub 存储库中创建一个文件吗?

如果这不可能,我的后续策略是将Orders 数据保存在 MongoDB 数据库中。我对 Mongo 还没有任何经验,但我知道它是基于使用类似 JSON 的语法的“平面”数据格式。我是否可以在通过 Netlify Lambda 函数提交时将订单数据保存在 Mongo 集合中,然后通过 Netlify 触发构建,并在我的应用程序中在构建时拉入 Mongo 数据,并以某种方式为每个订单对象创建一个文件,也许是通过盖茨比的 API?

我最后的办法是在我的应用程序中设置一个管理区域,可以在其中查看、修改和删除订单。我宁愿避免这种情况,因为 a) 我没有 Netlify Pro 服务,因此无法访问受密码保护的站点访问权限(尽管我不确定 NCMS 如何利用身份并能够避免高级计划?), b) 我希望通过同一平台 (Netlify CMS) 进行所有数据管理。

【问题讨论】:

  • 有关如何登录和使用后端的想法,您可以在 github repo 上查看 gatsby 商店的代码
  • 很高兴知道,谢谢

标签: reactjs mongodb gatsby netlify netlify-cms


【解决方案1】:

您绝对可以使用 Netlify 表单、函数和 Github API 做到这一点。我为我的一个 gatsby 网站做了类似的事情,其中​​表单数据直接提交给 Netlify 函数。

如果您想利用 Netlify Form 的垃圾邮件预防和电子邮件通知等功能,我认为它看起来像这样:

  • 设置您的Netlify Form
  • 设置一个监听submission-created 事件的Netlify function。在请求的正文中,您会找到一个 payload 对象,其中包含表单数据以及有关您的站点的信息(如果您有一堆)。 Netlify 有一个package,可以真正简化开发过程。

  • 触发对Github API 的调用,为该提交创建文件或更新包含所有提交的现有文件。

  • 此时,您可以设置 netlifyCMS 以读取该文件夹/文件的内容并允许管理员查看/修改提交的内容。

希望对你有帮助!

【讨论】:

  • 嘿,我有一个简单的问题。我很难找到来自表单的数据,而且很难测试,因为除非它在 ​​prod 中,否则我无法触发 lambda 事件(对吗??)。您引用的 payload 对象是否在 event 对象内部? context?
  • 嗨@Esten!如果您使用我提到的netlify-lambda 包,您可以在本地提供该功能并配置 gatsby 的代理中间件以在开发中对其进行测试。 IIRC 有效载荷是event 中的 JSON 字符串——所以const { payload } = JSON.parse(event.body)。此外,你的函数文件名必须是事件的名称——比如submission-created.js
  • 伙计,我完全失去了它。这是一件事后一件事。我在本地使用 netlify-lambda,我只是不确定是否能够在本地触发提交事件,因为我试图获取表单数据。但是,我认为我真正的问题是我的 event.body 正在返回 base64 编码。我试图解码它,但它实际上只是解码为字符串中的“[object Object]”。它几乎就像负载应该是 JSON 字符串一样,但它之前将 JS 对象转换为字符串有什么东西寄过来的吗?再次,它发回“W29iamVjdCBPYmplY3Rd”。
  • @Esten 等一下,我会寻找一个示例 repo 或制作一个。您能否确认每次表单提交都会触发表单提交功能,并且数据在 netlify 控制台中正确显示?
  • 不确定是否值得付出努力——我认为目前在函数中发生了一些 Netlify 错误。我在这里发了一个帖子,希望能有所进展community.netlify.com/t/…。感谢您为此提供的所有帮助!
猜你喜欢
  • 2019-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-18
  • 2020-07-18
  • 1970-01-01
相关资源
最近更新 更多