Files
node_server/bot/workflow/node/query_node.ts
T
2026-10-22 17:07:08 +08:00

41 lines
2.4 KiB
TypeScript

import type {NodeHandler} from '../../../types/bot/workflow/runtime.ts';
import type {WorkflowNodeTemplate} from '../../../types/bot/workflow/metadata.ts';
import {describe, failure_port, output, success_port} from '../metadata.ts';
import {assert_json, resolve_value} from '../runtime/value.ts';
export const config_template: WorkflowNodeTemplate = {
name: 'query', version: '1.0.0',
i18n: describe('查询数据', '解析命名参数后调用查询提供方,返回 JSON 数据,并可将结果保存到工作流变量。'),
provider: 'query',
config: [
{name: 'source', type: 'string', required: true, provider: 'query', max_length: 100,
i18n: describe('查询来源', '选择查询提供方,标识由 1 至 100 个字母、数字、下划线或连字符组成,禁止保留名称。')},
{name: 'args', type: 'map', required: true, default: {},
i18n: describe('查询参数', '按名称提供参数;键为 1 至 100 个字母、数字、下划线或连字符,禁止保留名称。'),
item: {name: 'argument', type: 'value_source', required: true,
i18n: describe('参数值', '解析字面量或状态引用,将得到的 JSON 值传给对应名称的查询参数。')}},
{name: 'save_as', type: 'string', required: false, max_length: 100,
i18n: describe('保存变量', '可选,将查询输出保存到 vars 中的此名称;名称为 1 至 100 个字母、数字、下划线或连字符,禁止保留名称。')},
],
output: output('json', '查询结果', '查询提供方返回的原始 JSON 值,与可选保存到 vars 的值相同。'),
ports: [success_port, failure_port],
};
export const execute: NodeHandler = async (node, state, signal, deps) => {
if (node.type !== 'query') throw new Error('Expected a query node');
signal.throwIfAborted();
const args = Object.fromEntries(Object.entries(node.config.args)
.map(([key, source]) => [key, resolve_value(source, state)]));
assert_json(args);
const output = await deps.query(node.config.source, args, signal);
signal.throwIfAborted();
assert_json(output);
const result = {status: 'success' as const, output};
if (node.config.save_as !== undefined) {
const vars = {[node.config.save_as]: output};
assert_json(vars);
return {port: 'success', result, vars};
}
return {port: 'success', result};
};