Nodul LogoNodul
Поток данных

Работа с файлами

Nodul поддерживает два способа работы с файлами в сценариях:

  • No-code узлы: вы передаёте ссылку на файл из одного узла в другой.
  • Узел JavaScript: вы читаете/изменяете/создаёте файл в коде и возвращаете его обратно как файловый вывод.

Передача файлов между no-code узлами

Когда узел выводит файл, он обычно содержит объект file с полями типа content (внутренний путь/ссылка), filename, extension и другими.

Пример узла, возвращающего файл

Типичное сопоставление в принимающих узлах

Большинство узлов принимают либо весь объект файла, либо запрашивают конкретные поля (например, File Path и Name). Используйте виджет-помощник для вставки значений из предыдущих узлов.

Поле принимающего узлаЧто сопоставлятьПример
File Path / File ContentСсылка/путь к файлу{{$2.result.file.content}}
NameИмя файла{{$2.result.file.filename}}
Extension (опционально)Расширение файла{{$2.result.file.extension}}

Сопоставление полей файла в другом узле

Работа с файлами в узле JavaScript

Если вам нужно прочитать, преобразовать или сгенерировать файл в коде, вы должны работать с путём к файлу и Node.js fs.

Шаг 1: Получение временного пути к файлу

Используйте шаблонный доступ к данным для получения пути к файлу из предыдущего узла (пример: Узел 2).

const contentFilePath = data["{{2.result.file.content}}"];

Чтение пути к файлу в узле JavaScript

Шаг 2: Чтение/изменение файла (Buffer)

Прочитайте файл по пути, выполните преобразование и создайте новый Buffer (или запишите байты напрямую).

Шаг 3: Запись и возврат файла

Запишите выходной файл во временную файловую систему и верните его с помощью хелпера file(), чтобы другие узлы могли его использовать.

Важно

Не возвращайте сырой путь из data[...] как финальный вывод. Всегда следуйте схеме: получить путь → прочитать → изменить → записать → вернуть file(...).

Пример вывода, возвращённого как файл

Совет: Попросите ИИ-агента вернуть бинарный файл

ИИ-агент внутри узла JavaScript может генерировать код, возвращающий бинарные файлы (изображения, PDF, CSV, видео и т.д.) из коробки. Вы можете явно попросить его:

  • Прочитать файл из вывода конкретного узла (например, «Узел 2»).
  • Обработать его (конвертировать, изменить размер, сжать, распарсить и т.д.).
  • Вернуть результат как файловый вывод с использованием file() и правильного fileType.

Пример промпта, который можно вставить в ИИ-чат в узле JavaScript:

Прочитай файл из вывода Узла 2 (result.file.content), конвертируй его в PDF и верни как бинарный файловый вывод с правильным MIME-типом.

Полный пример: Чтение → Изменение → Запись → Возврат (CSV)

import fs from 'fs';

export default async function run({ data }) {
  // 1) Получаем временный путь к файлу из вывода Узла 2
  const contentFilePath = data["{{2.result.file.content}}"];

  if (!contentFilePath) {
    throw new Error(
      'Путь к файлу не найден. Проверьте, что Узел 2 выводит result.file.content и вставьте его через виджет-помощник.'
    );
  }

  // 2) Читаем файл как Buffer
  const contentFileBuffer = fs.readFileSync(contentFilePath);

  // 3) Изменяем (пример: добавляем столбец ',"Processed"' к каждой строке CSV)
  const csvContent = contentFileBuffer.toString('utf8');
  const rows = csvContent.split('\n');

  const header = rows[0] ?? '';
  const processedRows = [header];

  for (let i = 1; i < rows.length; i++) {
    const row = rows[i];
    if (!row || row.trim() === '') continue;
    processedRows.push(`${row.trim()},"Processed"`);
  }

  const processedCsvString = processedRows.join('\n');
  const processedFileBuffer = Buffer.from(processedCsvString, 'utf8');

  // 4) Записываем и возвращаем как файловый вывод
  const newFileName = 'processed_data.csv';
  fs.writeFileSync(newFileName, processedFileBuffer);

  return {
    file: file(newFileName),
    fileType: 'text/csv',
  };
}