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

Fetch-события

HTTP-запросы

При каждом HTTP запросе Request объект отправляется в ваш worker, после чего сгенерированный Response возвращается. Request объект будет включать cf объект. Miniflare будет записывать в журнал метод, путь, статус и время, затраченное на ответ.

Если Worker выбрасывает ошибку при формировании ответа, вместо него возвращается страница ошибки, содержащая трассировку стека.

Отправка событий

При использовании API dispatchFetch функцию можно использовать для отправки fetch события в ваш Worker. Это можно использовать для тестирования ответов. dispatchFetch имеет тот же API, что и обычный fetch метод: он принимает либо Request объект, либо URL и необязательный RequestInit объект:

import { Miniflare, Request } from "miniflare";

const mf = new Miniflare({
	modules: true,
	script: `
  export default {
    async fetch(request, env, ctx) {
      const body = JSON.stringify({
        url: event.request.url,
        header: event.request.headers.get("X-Message"),
      });
      return new Response(body, {
        headers: { "Content-Type": "application/json" },
      });
    })
  }
  `,
});

let res = await mf.dispatchFetch("http://localhost:8787/");
console.log(await res.json()); // { url: "http://localhost:8787/", header: null }

res = await mf.dispatchFetch("http://localhost:8787/1", {
	headers: { "X-Message": "1" },
});
console.log(await res.json()); // { url: "http://localhost:8787/1", header: "1" }

res = await mf.dispatchFetch(
	new Request("http://localhost:8787/2", {
		headers: { "X-Message": "2" },
	}),
);
console.log(await res.json()); // { url: "http://localhost:8787/2", header: "2" }

При диспетчеризации событий вы должны самостоятельно добавить CF-* заголовки и cf объект. Это позволяет управлять их значениями при тестировании:

const res = await mf.dispatchFetch("http://localhost:8787", {
	headers: {
		"CF-IPCountry": "GB",
	},
	cf: {
		country: "GB",
	},
});

Апстрим

Miniflare будет вызывать каждый fetch обработчик, пока не будет возвращён ответ. Если ответ не возвращён или выброшено исключение, и passThroughOnException() был вызван, ответ будет получен с указанного вышестоящего источника (upstream) вместо этого:

import { Miniflare } from "miniflare";

const mf = new Miniflare({
	script: `
  addEventListener("fetch", (event) => {
    event.passThroughOnException();
    throw new Error();
  });
  `,
	upstream: "https://miniflare.dev",
});
// If you don't use the same upstream URL when dispatching, Miniflare will
// rewrite it to match the upstream
const res = await mf.dispatchFetch("https://miniflare.dev/core/fetch");
console.log(await res.text()); // Source code of this page