Шаги JavaScript
Шаг JavaScript код выполняется на вашем Mac в среде Node.js внутри QueryLane. У него есть доступ к файлам, сети, процессам и установленным npm-пакетам, поэтому запускайте только код, которому доверяете.
Как выполняется код
Код шага — это тело асинхронной функции. В нём можно использовать await, а значение, которое станет результатом шага, нужно вернуть через return. Без return результат будет undefined.
По умолчанию шагу даётся 30 секунд. Для долгой работы задайте Таймаут выполнения (мс), максимум 24 часа.
Результаты шагов и переменные
Перед запуском QueryLane заменяет каждый токен значением:
${step_id}превращается в данные этого шага в виде JSON-литерала: массив строк SQL, тело ответа API, возвращённый объект и так далее. Даты в данных приходят строками ISO.- Переменная типа Число вставляется как число.
- Переменная типа Дата превращается в
new Date("..."). - Переменная типа Строка вставляется как есть, поэтому возьмите её в кавычки:
const region = '${region}';.
Все переменные также доступны в объекте variables, например variables.region.
Токены шагов вставляйте из блока Результаты шагов: в редакторе. Идентификаторы, созданные в редакторе, длинные, например step_4f0c..., а в примерах на этой странице использованы короткие.
Глобальные объекты
В коде доступны стандартные встроенные объекты JavaScript и такие глобальные объекты:
console. Вывод попадает в журналы QueryLane, а не в результат запуска.setTimeout,setInterval,clearTimeoutиclearInterval.require,process,Buffer,__dirnameи__filename.variablesс переменными задачи.
Веб-API вроде fetch здесь не глобальные. Всё нужное загружайте через require: модули Node.js, например node:fs и node:path, и пакеты, встроенные в QueryLane. Среди них dayjs, csv-parse, csv-stringify, exceljs, xlsx, yaml, zod, undici, pg, mysql2, mongodb и @clickhouse/client. Для HTTP используйте const { fetch } = require('undici');.
Пример
SQL-шаг step_orders возвращает заказы с полями customer_id, amount и created_at. Этот шаг считает сумму по каждому клиенту:
const dayjs = require('dayjs');
const orders = ${step_orders};
const totals = new Map();
for (const order of orders) {
const sum = totals.get(order.customer_id) ?? 0;
totals.set(order.customer_id, sum + Number(order.amount));
}
return [...totals].map(([customerId, total]) => ({
customer_id: customerId,
total: Math.round(total * 100) / 100,
report_date: dayjs().format('YYYY-MM-DD'),
}));Результат — массив строк, так что следующий шаг может загрузить его в таблицу или отправить в API, а к самому шагу можно добавить проверки результата.
Установка npm-пакетов
- Откройте Настройки > Зависимости.
- В разделе Установка введите имя пакета и при необходимости версию. Пустая версия означает последнюю.
- Нажмите Установить пакет.
Установленные пакеты появляются в разделе Установленные пакеты, там же их можно удалить. Пакеты, встроенные в QueryLane, в списке не показываются и не удаляются.
Для приватного реестра до установки впишите настройки реестра и токены в поле .npmrc в разделе Конфигурация:
@acme:registry=https://npm.acme.dev/
//npm.acme.dev/:_authToken=YOUR_TOKENЕсли шаг импортирует неустановленный пакет, запуск завершается ошибкой NPM-пакет недоступен, а в разделе История выполнений у запуска появляется кнопка вроде Установить lodash.
npm на вашем Mac
Пакеты устанавливаются через npm, а в Node.js внутри приложения npm нет. Установите на Mac Node.js вместе с npm, например через Homebrew или nvm. QueryLane ищет npm:
- рядом с Node.js из Настройки > Общее > Исполняемый файл Node.js, если он указан;
- в
~/.nvm/versions/node/<версия>/bin/npm; - в
/usr/local/bin/npm,/opt/homebrew/bin/npmи/usr/bin/npm.
Если npm не найден, установка завершается ошибкой Исполняемый файл npm не найден.
Импорт или глобальный объект
Для установленных пакетов используйте строку import в начале шага:
import { chunk } from 'lodash';
return chunk(${step_orders}, 500);Каждый установленный пакет доступен и как глобальный объект без импорта. Его имя — __pkg_ и имя пакета без начального @, где /, - и . заменены на _: lodash становится __pkg_lodash, @faker-js/faker становится __pkg_faker_js_faker. С import код читается проще.
import работает только с пакетами из Настройки > Зависимости. Встроенные пакеты и модули Node.js загружайте через require.