You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用JavaScript通过GraphQL处理邮件特殊字符与HTML并存储至PostgreSQL

解决方案

1. Base64编码存储HTML内容

  • 操作步骤:在N8N工作流里,用Node.js的Buffer.from(htmlContent).toString('base64')把原始HTML转成Base64字符串
  • 存入Hasura:直接将Base64字符串作为普通字符串传入GraphQL mutation,彻底规避特殊字符导致的语法错误
  • 读取与编辑:
    • Directus端:自定义扩展显示组件,将Base64解码回HTML渲染;编辑时再重新编码存入
    • 系统回复:解码后获取完整原始HTML,直接复用或修改后再编码存储
  • 优点:100%保留HTML格式,GraphQL传输无阻碍,仅需对Directus做轻量扩展

2. 用PostgreSQL的text/jsonb字段存原始HTML

  • 字段配置:把邮件内容字段设为text(无长度限制)或jsonb(需结构化存储时用)
  • Hasura处理:确保字段映射为GraphQL的String类型,用变量传递方式传入原始HTML,Hasura会自动处理特殊字符转义:
    // N8N中用变量传参的示例代码
    const htmlContent = await fetchIMAPEmail(); // 从IMAP拿到的原始HTML
    const mutation = `
      mutation InsertEmail($content: String!) {
        insert_emails_one(object: {content: $content}) {
          id
        }
      }
    `;
    // 调用Hasura API时传入变量:{ "content": htmlContent }
    
  • 优点:无需编码解码,Directus可直接识别text字段,开启富文本模式就能查看编辑原始HTML

3. 敏感信息按需脱敏

针对权限控制需求(隐藏邮箱、手机号),分两种处理方式:

  • 存入前脱敏:在N8N里用正则替换HTML中的敏感内容,比如htmlContent.replace(/([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,})/g, '[隐藏邮箱]'),不同角色对应不同脱敏规则
  • 读取时脱敏:在Hasura配置自定义权限规则,或在Directus添加显示钩子,根据当前用户角色动态替换敏感内容,原始HTML仍完整存储

4. 直接操作PostgreSQL绕过GraphQL限制

如果上述方法仍有问题,在N8N里用pg库直接插数据,再同步给Hasura:

// N8N直接操作PostgreSQL示例
const { Client } = require('pg');
const client = new Client({ connectionString: '你的PostgreSQL连接字符串' });
await client.connect();
await client.query('INSERT INTO emails (content) VALUES ($1)', [htmlContent]);
await client.end();
  • 优点:完全避开GraphQL的字符限制,不影响Directus和Hasura读取数据

内容的提问来源于stack exchange,提问作者Kaspar L. Palgi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 22:25:20