如何用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
相关产品推荐
相关产品推荐

