Своя база данных — прямо из скрипта и со страницы сайта
Заявка с лендинга ложится в вашу таблицу ещё до того, как страница ответила посетителю. Скрипт по расписанию сверяется с вашими данными, прежде чем трогать кампании. И то и другое — несколько строк того же JavaScript, на котором в Qubix пишутся скрипты и обработчики сайтов.
Это Qubix.db — подключение к вашей собственной базе PostgreSQL или MySQL (MariaDB тоже) прямо
из кода Qubix. Оно работает в двух местах: в скриптах и в обработчиках страниц
залитого сайта. Код открывает соединение строкой соединения, читает строки
запросом и меняет данные — с теми правами, которые база даёт учётной записи из этой строки.
Что это даёт
Заявки — сразу в вашу базу. Обработчик страницы принимает форму и записывает её в вашу таблицу
вместе со страной посетителя и метками перехода, которые передала страница, — click_id,
sub1…sub5. Запись делается прямо во время запроса, поэтому строка уже в базе, когда посетитель
видит ответ.
Страница отвечает по вашим данным. Прежде чем ответить, обработчик может спросить вашу базу: проверить промокод, найти запись по номеру из ссылки, решить, куда отправить посетителя.
Ваша база решает — скрипт исполняет. Скрипт по расписанию читает вашу таблицу — например, стоп-лист кампаний — и по ней ставит кампании на паузу или включает их. Работает и обратный путь: скрипт кладёт числа Qubix в вашу таблицу.
Соединение идёт туда, куда разрешил администратор. Qubix подключается к вашей базе напрямую и только к тем узлам, которые администратор вписал в перечень.
Как это устроено
Qubix.db.connect() принимает строку соединения — postgres:// или postgresql:// для PostgreSQL,
mysql:// или mariadb:// для MySQL и MariaDB — и отдаёт соединение. У соединения query выполняет запрос и отдаёт строки — каждая строка приходит
объектом с именами колонок, — exec выполняет изменение и отдаёт число изменённых строк, а close
закрывает соединение.
Значения передаются отдельно от текста запроса — $1, $2 у PostgreSQL, ? у MySQL, — поэтому то,
что прислал посетитель, остаётся значением и не становится частью самого запроса. Соединение, которое
код оставил открытым, закрывается само, когда запуск закончился. У обработчика каждый запрос страницы
открывает свои соединения и закрывает их до ответа посетителю.
Куда можно соединяться, решает администратор: перечень Узлы баз данных для скриптов лежит в окне Настройки Qubix на вкладке JavaScript. Перечень один на скрипты и обработчики страниц, и пустой перечень выключает подключения. Имя узла в перечне открывает только адреса из интернета; базу во внутренней сети вписывают адресом или сетью — после этого к ней можно обращаться и по имени. На той же вкладке стоят пределы: сколько подключений и запросов на один запуск скрипта или на один запрос страницы, сколько строк на запрос, какой объём ответа и какой срок у запроса. Строки сверх предела не читаются, и об этом говорит предупреждение — в консоли скрипта или в журнале тестового запуска обработчика.
Пароль из строки соединения в тексты ошибок не попадает: если база отказала во входе, консоль покажет причину уже без него.
Пример: заявка с лендинга — сразу в вашу базу
Обработчик пути /lead в карточке сайта, вкладка Бэкенд. Он записывает
заявку и отправляет посетителя на страницу благодарности:
function handle(req, res) {
const lead = req.body || {}
const geo = req.variables.geo || ''
const db = Qubix.db.connect('postgres://landing:пароль@db.example.com:5432/crm')
db.exec(
'INSERT INTO leads (email, click_id, geo) VALUES ($1, $2, $3)',
[lead.email || null, req.variables.click_id || null, geo],
)
db.close()
const thanks = new URL('https://example.com/thanks')
thanks.searchParams.set('geo', geo)
res.redirect(thanks.toString())
}
req.body приходит уже разобранным — и JSON, и поля формы. Страну посетителя Qubix определяет сам,
а click_id и sub1…sub5 берутся из параметров запроса.
Пример: ваша база решает, скрипт исполняет
Скрипт по расписанию читает стоп-лист из вашей базы MySQL и ставит эти кампании на паузу на сутки:
function main() {
const db = Qubix.db.connect('mysql://qubix:пароль@db.example.com:3306/team')
const stop = db.query('SELECT campaign_id FROM stop_list WHERE active = 1')
.map((row) => String(row.campaign_id))
db.close()
const campaigns = QubixApp.campaigns().filter((c) => stop.includes(c.campaign_id)).get()
for (const campaign of campaigns) {
campaign.pause({ duration: '24h', reason: 'стоп-лист из базы команды' })
}
}
Где включить
- Администратор открывает Настройки Qubix → JavaScript и вписывает узел вашей базы в поле Узлы баз данных для скриптов — по одному на строку. Пока поле пустое, подключения к базам выключены.
- Пределы для скриптов стоят там же, под перечнем; пределы для обработчиков — в блоке Обработчики страниц сайтов.
- Скрипт пишется в разделе Скрипты и проверяется кнопкой Запустить. Обработчик пишется в карточке сайта на вкладке Бэкенд и проверяется кнопкой Запуск.
Кнопки запуска выполняют код целиком, вместе с запросами к базе: INSERT из обработчика, запущенного
кнопкой Запуск, добавит строку в вашу таблицу. Для проверок держите отдельную
таблицу или отдельную базу.
Подсказки редактора знают Qubix.db
Редактор скрипта и редактор обработчика на вкладке Бэкенд подсказывают
Qubix.db так же, как остальные команды: начните вводить Qubix.db. — и редактор предложит
connect, а у соединения — query, exec и close с описаниями.
Рядом в этом же выпуске
Обработчик в форме handle(req, res). Имена те же, что в Node и Express: тело запроса уже
разобрано в req.body, рядом req.cookies и req.ip, ответ собирают res.json, res.send,
res.redirect и res.cookie, а console.log пишет в журнал прогона. Обработчики в прежней форме
handle(r) работают как раньше. Подробнее — Код обработчика.
URL и URLSearchParams во всём JavaScript Qubix — в скриптах, правилах Britva и
обработчиках страниц: ссылка и строка запроса разбираются и собираются этими привычными именами, поэтому
код, разбирающий ссылки, переносится из браузера почти как есть. Подробнее —
Какой стандартный JavaScript доступен.
Ваши данные остаются в вашей базе, а скрипт и страница сайта теперь работают с ней напрямую.