n8n自定义Oracle节点报错:未找到凭据测试函数
问题分析与解决方案
你遇到的核心问题是n8n的凭据测试函数必须绑定到对应的Credentials类中,而非Node类的methods对象。你当前把测试函数放在Node类里,n8n会去对应的凭据类型类中查找测试函数,自然找不到,所以提示“凭据无对应测试函数”。
具体修正步骤
1. 创建独立的凭据类文件
新建一个凭据类文件(比如MyOracleCredentials.ts),将测试函数定义在这个类的methods.credentialTest中:
import { ICredentialTestFunctions, ICredentialsDecrypted, ICredentialType, INodeCredentialTestResult } from 'n8n-workflow'; // 引入Oracle驱动或你的连接工具 import * as oracledb from 'oracledb'; export class MyOracleCredentials implements ICredentialType { name = 'myConnection'; // 必须和node.ts中credentials配置的name完全一致 displayName = 'Oracle 数据库连接'; properties = [ // 这里定义你的凭据属性,例如: { displayName: '主机地址', name: 'host', type: 'string', required: true, }, { displayName: '端口', name: 'port', type: 'number', default: 1521, required: true, }, // 其他属性:用户名、密码、SID/服务名等 ]; methods = { credentialTest: { testConnection: async function(this: ICredentialTestFunctions, credential: ICredentialsDecrypted): Promise<INodeCredentialTestResult> { try { // 编写Oracle连接测试逻辑 const connection = await oracledb.getConnection({ user: credential.user, password: credential.password, connectString: `${credential.host}:${credential.port}/${credential.serviceName}` }); await connection.close(); return { status: 'success', message: '连接测试成功' }; } catch (error) { return { status: 'error', message: `连接失败:${error.message}` }; } } } }; }
2. 修改Node类的配置
在你的node.ts中,只需保留对凭据的引用,移除Node类methods里的credentialTest配置:
import { OracleNode } from 'n8n-workflow'; import { MyOracleCredentials } from './MyOracleCredentials'; export class CustomOracleNode extends OracleNode { // ... 其他节点配置 credentials = [ { name: 'myConnection', // 和凭据类的name一致 required: true, testedBy: 'testConnection' // 对应凭据类中定义的测试函数名 } ]; methods = { listSearch: { searchTables } // 移除这里的credentialTest配置 }; }
3. 确保凭据类被正确注册
在节点的入口文件(比如index.ts)中,同时注册节点和凭据类:
import { CredentialsType, NodeType } from 'n8n-core'; import { CustomOracleNode } from './node'; import { MyOracleCredentials } from './MyOracleCredentials'; export const credentialTypes: CredentialsType[] = [ MyOracleCredentials ]; export const nodeTypes: NodeType[] = [ CustomOracleNode ];
关键注意事项
- 凭据类的
name必须和Node类credentials配置中的name完全一致(大小写敏感) - 测试函数的签名必须严格符合
ICredentialTestFunction接口,包括this的类型和返回值格式 - 确保凭据类被正确注册到n8n系统中,否则无法被识别
内容的提问来源于stack exchange,提问作者lucianblignaut
相关产品推荐
相关产品推荐

