Перейти к основному содержимому

Своя база данных — прямо из скрипта и со страницы сайта

Заявка с лендинга ложится в вашу таблицу ещё до того, как страница ответила посетителю. Скрипт по расписанию сверяется с вашими данными, прежде чем трогать кампании. И то и другое — несколько строк того же 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 в карточке сайта, вкладка Бэкенд. Он записывает заявку и отправляет посетителя на страницу благодарности:

lead-to-db.jsJavaScript
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 и ставит эти кампании на паузу на сутки:

stop-list-from-db.jsJavaScript
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: 'стоп-лист из базы команды' })
}
}

Где включить​

  1. Администратор открывает Настройки Qubix → JavaScript и вписывает узел вашей базы в поле Узлы баз данных для скриптов — по одному на строку. Пока поле пустое, подключения к базам выключены.
  2. Пределы для скриптов стоят там же, под перечнем; пределы для обработчиков — в блоке Обработчики страниц сайтов.
  3. Скрипт пишется в разделе Скрипты и проверяется кнопкой Запустить. Обработчик пишется в карточке сайта на вкладке Бэкенд и проверяется кнопкой Запуск.
Проверочный запуск работает с базой по-настоящему

Кнопки запуска выполняют код целиком, вместе с запросами к базе: 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 доступен.


Ваши данные остаются в вашей базе, а скрипт и страница сайта теперь работают с ней напрямую.

Что дальше​