如何在Foundry中用TypeScript验证本体对象类型的附件上传?
在Ontology Function Backed Action中实现文件上传前的内容验证(TypeScript)
核心思路
在原有的文件上传动作逻辑中插入前置验证步骤:先读取上传文件的内容,执行自定义的验证规则,只有验证通过后才将文件保存到Ontology对象的attachment属性;验证失败则直接抛出错误终止流程。
具体实现步骤
1. 准备依赖与类型定义
根据Ontology的运行环境,引入对应的文件处理工具(Node.js环境用fs/buffer,前端环境用FileReader),同时导入Ontology SDK相关类型:
// 导入Ontology SDK类型(根据实际SDK调整) import { OntologyObject, AttachmentService } from '@your-ontology-sdk'; // Node.js环境文件处理模块 import { readFileSync } from 'fs';
2. 编写自定义验证函数
根据需求编写验证逻辑,以下是两个常见场景的示例:
示例1:验证文本文件包含特定关键词
/** * 验证文件内容是否包含指定关键词 * @param fileContent 文件内容字符串 * @param targetKeyword 要检测的关键词 * @returns 验证结果 */ function validateFileContainsKeyword(fileContent: string, targetKeyword: string): boolean { return fileContent.includes(targetKeyword); }
示例2:验证CSV文件包含指定列
/** * 验证CSV文件是否包含指定列 * @param csvContent CSV内容字符串 * @param requiredColumns 必须存在的列名数组 * @returns 验证结果 */ function validateCSVColumns(csvContent: string, requiredColumns: string[]): boolean { const headerRow = csvContent.split('\n')[0].trim(); const existingColumns = headerRow.split(',').map(col => col.trim()); return requiredColumns.every(col => existingColumns.includes(col)); }
3. 改造Function Backed Action逻辑
将验证步骤嵌入原上传动作,完整代码示例:
/** * 带内容验证的文件上传动作 * @param ontologyObject 目标Ontology对象 * @param file 待上传的文件(Node.js为路径/Buffer;前端为File对象) * @param validationConfig 验证配置 */ async function uploadFileWithValidation( ontologyObject: OntologyObject, file: string | Buffer | File, validationConfig: { type: 'keyword' | 'csv-columns'; value: string | string[] } ): Promise<void> { // 1. 读取文件内容 let fileContent: string; if (typeof file === 'string') { // Node.js环境:从路径读取 fileContent = readFileSync(file, 'utf-8'); } else if (file instanceof Buffer) { // Buffer转字符串 fileContent = file.toString('utf-8'); } else if (file instanceof File) { // 前端环境:异步读取文件 fileContent = await new Promise((resolve, reject) => { const reader = new FileReader(); reader.onload = () => resolve(reader.result as string); reader.onerror = reject; reader.readAsText(file); }); } else { throw new Error('不支持的文件类型'); } // 2. 执行验证逻辑 let isValid = false; switch (validationConfig.type) { case 'keyword': isValid = validateFileContainsKeyword(fileContent, validationConfig.value as string); if (!isValid) throw new Error(`文件未包含必填关键词:${validationConfig.value}`); break; case 'csv-columns': isValid = validateCSVColumns(fileContent, validationConfig.value as string[]); if (!isValid) throw new Error(`CSV文件缺少必填列:${(validationConfig.value as string[]).join(', ')}`); break; default: throw new Error('不支持的验证类型'); } // 3. 验证通过,执行原上传逻辑 await AttachmentService.upload(ontologyObject.id, file, ontologyObject.attachment); }
4. 错误处理与调用示例
调用动作时捕获验证失败的错误,返回给前端或日志系统:
try { await uploadFileWithValidation( targetOntologyObject, './user-data.csv', { type: 'csv-columns', value: ['user_id', 'username', 'email'] } ); console.log('文件上传成功'); } catch (error) { console.error('上传失败:', (error as Error).message); // 可在此返回错误给前端或触发告警 }
注意事项
- 根据Ontology运行环境调整文件读取方式(前端/Node.js存在差异)
- 验证逻辑可按需扩展(比如正则匹配、JSON Schema校验等)
- 大文件建议用流式读取验证,避免内存溢出
内容的提问来源于stack exchange,提问作者Aniket Pande
相关产品推荐
相关产品推荐

