INTEGRITY Документация

Запрос из Worker

Если вы хотите обращаться к данным Analytics Engine прямо из Worker, можно использовать fetch для доступа к SQL API. API может возвращать данные в формате JSON, с которыми удобно работать в JavaScript.

Аутентификация

Чтобы ваш Worker мог пройти аутентификацию в API, вам потребуются ID аккаунта и API-токен.

Мы рекомендуем хранить ID аккаунта в переменной окружения, а API-токен в качестве секрета (secret) в своём воркере. Это можно сделать через дашборд или через Wrangler. См. Документация Workers , где приведены дополнительные сведения об этом.

Запрос

Используйте JavaScript fetch API следующим образом, чтобы выполнить запрос:

const query = "SELECT * FROM my_dataset";
const API = `https://api.cloudflare.com/client/v4/accounts/${env.ACCOUNT_ID}/analytics_engine/sql`;
const response = await fetch(API, {
	method: "POST",
	headers: {
		Authorization: `Bearer ${env.API_TOKEN}`,
	},
	body: query,
});
const responseJSON = await response.json();

Данные будут возвращены в формате, описанном в FORMAT раздел документации, который позволяет получать метаинформацию об именах и типах возвращаемых столбцов, помимо самих данных и количества строк.

Пример Worker

Ниже приведён пример Worker, который выполняет запрос к набору данных с показаниями погоды и выводит минимальные и максимальные значения для каждого города.

Настройка переменных окружения

Сначала настраиваются переменные окружения: в них указываются ID аккаунта и API-токен.

ID аккаунта задаётся в конфигурационный файл Wrangler:

{
	"vars": {
		"ACCOUNT_ID": "<account_id>"
	}
}
[vars]
ACCOUNT_ID = "<account_id>"

Переменную API_TOKEN можно задать в качестве секрета (secret) с помощью инструмента командной строки wrangler. Выполните следующую команду и введите строку своего токена:

npx wrangler secret put API_TOKEN

Скрипт Worker

Сам скрипт воркера выполняет запрос и форматирует результат:

export default {
	async fetch(request, env) {
		// This worker only responds to requests at the root.
		if (new URL(request.url).pathname != "/") {
			return new Response("Not found", { status: 404 });
		}

		// SQL string to be executed.
		const query = `
            SELECT
                blob1 AS city,
                max(double1) as max_temp,
                min(double1) as min_temp
            FROM weather
            WHERE timestamp > NOW() - INTERVAL '1' DAY
            GROUP BY city
            ORDER BY city`;

		// Build the API endpoint URL and make a POST request with the query string
		const API = `https://api.cloudflare.com/client/v4/accounts/${env.ACCOUNT_ID}/analytics_engine/sql`;
		const queryResponse = await fetch(API, {
			method: "POST",
			headers: {
				Authorization: `Bearer ${env.API_TOKEN}`,
			},
			body: query,
		});

		// The API will return a 200 status code if the query succeeded.
		// In case of failure we log the error message and return a failure message.
		if (queryResponse.status != 200) {
			console.error("Error querying:", await queryResponse.text());
			return new Response("An error occurred!", { status: 500 });
		}

		// Read the JSON data from the query response and render the data as HTML.
		const queryJSON = await queryResponse.json();
		return new Response(renderResponse(queryJSON.data), {
			headers: { "content-type": "text/html" },
		});
	},
};

// renderCity renders a table row as HTML from a data row.
function renderCity(row) {
	return `<tr><td>${row.city}</td><td>${row.min_temp}</td><td>${row.max_temp}</td></tr>`;
}

// renderResponse renders a simple HTML table of results.
function renderResponse(data) {
	return `<!DOCTYPE html>
<html>
    <body>
        <table>
            <tr><th>City</th><th>Min Temp</th><th>Max Temp</th></tr>
            ${data.map(renderCity).join("\n")}
        </table>
    </body>
<html>`;
}