如何在Gatsby中使用createResovers将Markdown字段不是文件转换为HTML

如何解决如何在Gatsby中使用createResovers将Markdown字段不是文件转换为HTML

在Gatsby中将MD转换为HTML的标准过程是在本地系统上获取完整文件。

我需要转换一个特定的字段,而不是文件。与最相关的问题是this one,但是您可以看到它正在使用Contentful,它现在提供了一个插件来解决它。

我正在使用的API(Airtable)返回一个包含Markdown的字段。

recommended solution要使用解析器进行转换...但是我不能完全理解盖茨比docs on the topic

构建时看到的错误是这样的:

UNHANDLED REJECTION Airtable.FAQ provided incorrect OutputType:
 'Object({ resolve: [function resolve],extensions: Object({ createdFrom: "createResolvers" }) })'

我想我很亲密,但是我不知道我是要创建一个新类型还是实际上解析器要返回...一个新字段?

有问题的字段为FAQ,您可以在GraphQL资源管理器的查询示例中看到该字段:

query MyQuery {
  allAirtableManufacturer(filter: {data: {Premium: {eq: true}}}) {
    edges {
      node {
        data {
          Premium
          Manufacturer
          Premium_Manufacturers {
            recordId
            data {
              FAQ
              Downloads_File_Name
              Is_Supplier
            }
            internal {
              type
            }
          }
        }
        recordId
        queryName
      }
    }
  }
}

我的理解是,解析器可以/应该添加一个新字段,并将markdown内容转换为html。

这是我的解析器代码,在这里您可以看到我正在尝试向Airtable节点添加一个名为“ FAQ_html”的字段:

  createResolvers({
    Airtable: {
      FAQ_html: {
        resolve(source: any,args: any,context: any,info: any) {
          return remark().use(html).processSync(source.data.FAQ).contents
        },},}
  })

我用于airtable的gatsby-config是:

    resolve: `gatsby-source-airtable`,options: {
        apiKey: process.env.AIRTABLE_API_KEY,concurrency: 5,tables: [
          {
            baseId: `appP5vBdAitw6yyDH`,tableName: `Manufacturers`,queryName: `Manufacturer`,tableView: `AppView_Details_DONOTCHANGE`,tableLinks: [`Premium_Manufacturers`],separateNodeType: true,defaultValues: {
              Company_Description: '',{
            baseId: `appP5vBdAitw6yyDH`,tableName: 'Premium_Manufacturers',tableLinks: [`Manufacturers`],],

表'Premium_Manufacturers'显然是作为'Manufacturers'的子链接。

但是,当我在GraphQL中浏览时,我也看到它们显示为一个名为“ Airtable”的顶级节点,这是我所没有想到的。您可以在这里看到它:

allAirtable {
    edges {
      node {
        data {
          FAQ
          Downloads_File_Name
          Last_update
          Is_Supplier
          Section_Name
          Section_No
          Name
          Cell_Number
          Email
          Rep_Name
          Technical_Rep_Name
          Consolidated_Rep
        }
      }
    }
  }

这就是为什么我的解析器使用“ Airtable”作为节点的名称,但显然它不起作用。

我还尝试更改配置以提供单独的节点:

          {
            baseId: `appP5vBdAitw6yyDH`,queryName: 'Premium',

所以现在'allAirtable'变成'allAirtablePremium'。

我尝试更改解析器以使用它:

  createResolvers({
    allAirtablePremium: {
      FAQ_html: {
        resolve(source: any,}
  })

但这会引发警告:

warn `createResolvers` passed resolvers for type `allAirtablePremium` that doesn't exist in the schema.

很明显,它不喜欢“全部”,因此我将其更改为删除“全部”,如下所示:

  createResolvers({
    AirtablePremium: {
      FAQ_html: {
        resolve(source: any,}
  })

我又回到了最初的错误,它至少告诉我我尝试返回的内容有问题(因为错误清楚地表明“错误的OutputType”)。

那应该返回什么?

在此先感谢您的帮助!

更新1

代码现在可以编译,但是看不到我的自定义字段。

这是模式自定义(只需将FAQ_HTML创建为空字符串即可开始)

import { GatsbyNode,CreateSchemaCustomizationArgs } from 'gatsby'

export const createSchemaCustomization: GatsbyNode['createSchemaCustomization'] = async ({
  actions,}: CreateSchemaCustomizationArgs) => {

  const { createFieldExtension,createTypes } = actions
  createFieldExtension({
    name: "FAQ_HTML",extend() {
      return ''
    },})

  const typeDefs = `
    type airtablePremium implements Node {
      FAQ_HTML: String @FAQ_HTML
    }
`

  createTypes(typeDefs)
}

解析器现在是这样的:

  createResolvers({
    airtablePremium: {
      FAQ_HTML: {
        resolve(source: any,info: any) {
          console.log("SOURCE IS",source)
          const faqHtml = remark().use(html).processSync(source.FAQ).contents
          console.log("faqHtml IS",faqHtml)
          return faqHtml;
        },})

它可以编译,但是该字段不会显示在GraphQL资源管理器中。也没有控制台输出。

解决方法

与@rmcsharry进行愉快的聊天后,我们确认您需要首先创建类型。

createTypes(`
  type AirtablePremium implements Node @infer {
    FAQ_HTML: String
  }
`)

最大的问题是类型名称。在代码中,它应该是AirtablePremiumairtablePremium。您可以通过单击左列中的字段名称,或按住 cmd 并单击查询中的字段来在GraphiQL中找到类型名称。

您还将在createResolvers中使用类型名:

  createResolvers({
    AirtablePremium: {
      FAQ_HTML: {
        resolve(source: any,args: any,context: any,info: any) {
          ...
        },},})

从@rmcsharry更新

在@Derek Nguyen的非常有用的帮助之后,我找到了一个替代的更简单的解决方案。

如果要避免创建类型的麻烦,可以使用markdown-to-jsx插件提供更简单的解决方案。

然后,您只需包装传入的降价字段:

<Markdown>{field}</Markdown>

并动态创建一个React JSX组件。 :)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)&gt; insert overwrite table dwd_trade_cart_add_inc &gt; select data.id, &gt; data.user_id, &gt; data.course_id, &gt; date_format(
错误1 hive (edu)&gt; insert into huanhuan values(1,&#39;haoge&#39;); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive&gt; show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 &lt;configuration&gt; &lt;property&gt; &lt;name&gt;yarn.nodemanager.res