summaryrefslogtreecommitdiff
path: root/docs/src/pages/guides/data-fetching.md
blob: c853dfe549616ae2aefffb785ebcd63e424f2bc3 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
---
layout: ~/layouts/MainLayout.astro
title: Data Fetching
---

Astro components and pages can fetch remote data to help generate your pages. Astro provides two different tools to pages to help you do this: **fetch()** and **top-level await.**

## `fetch()`

Astro pages have access to the global `fetch()` function in their setup script. `fetch()` is a native JavaScript API ([MDN<span class="sr-only">- fetch</span>](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch)) that lets you make HTTP requests for things like APIs and resources.

Even though Astro component scripts run inside of Node.js (and not in the browser) Astro provides this native API so that you can fetch data at page build time.

```astro
---
// Movies.astro
const response = await fetch('https://example.com/movies.json');
const data = await response.json();
// Remember: Astro component scripts log to the CLI
console.log(data);
---
<!-- Output the result to the page -->
<div>{JSON.stringify(data)}</div>
```

## Top-level await

`await` is another native JavaScript feature that lets you await the response of some asynchronous promise ([MDN<span class="sr-only">- await</span>](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/await)). Astro supports `await` in the top-level of your component script.

**Important:** These are not yet available inside of non-page Astro components. Instead, do all of your data loading inside of your pages, and then pass them to your components as props.

## Using `fetch()` outside of Astro Components

If you want to use `fetch()` in a non-astro component, use the [`node-fetch`](https://github.com/node-fetch/node-fetch) library:

```tsx
// Movies.tsx
import fetch from 'node-fetch';
import type { FunctionalComponent } from 'preact';
import { h } from 'preact';

const data = fetch('https://example.com/movies.json').then((response) =>
  response.json()
);

// Components that are build-time rendered also log to the CLI.
// If you loaded this component with a directive, it would log to the browser console.
console.log(data);

const Movies: FunctionalComponent = () => {
  // Output the result to the page
  return <div>{JSON.stringify(data)}</div>;
};

export default Movies;
```

If you load a component using `node-fetch` [interactively](/core-concepts/component-hydration), with `client:load`, `client:visible`, etc., you'll need to either not use `node-fetch` or switch to an [isomorphic](https://en.wikipedia.org/wiki/Isomorphic_JavaScript) library that will run both at build time and on the client, as the [`node-fetch` README.md](https://github.com/node-fetch/node-fetch#motivation) recommends:

> Instead of implementing XMLHttpRequest in Node.js to run browser-specific [Fetch polyfill](https://github.com/github/fetch), why not go from native http to fetch API directly? Hence, node-fetch, minimal code for a window.fetch compatible API on Node.js runtime.
>
> See Jason Miller's [isomorphic-unfetch](https://www.npmjs.com/package/isomorphic-unfetch) or Leonardo Quixada's [cross-fetch](https://github.com/lquixada/cross-fetch) for isomorphic usage (exports node-fetch for server-side, whatwg-fetch for client-side).

> Quoted from https://github.com/node-fetch/node-fetch#motivation
ctor(actions): use `Omit` to avoid leaking types to shared context (#13429)Gravatar Emanuele Stoppa 5-11/+41 2025-03-26[ci] release (#13504)astro@5.5.5@astrojs/vue@5.0.8@astrojs/tailwind@6.0.2@astrojs/svelte@7.0.8@astrojs/studio@0.1.5@astrojs/solid-js@5.0.6@astrojs/react@4.2.2@astrojs/preact@4.0.7@astrojs/netlify@6.2.4@astrojs/mdx@4.2.2@astrojs/markdoc@0.13.2@astrojs/db@0.14.9@astrojs/cloudflare@12.3.1@astrojs/alpinejs@0.4.4Gravatar Houston (Bot) 56-132/+197 2025-03-26[ci] formatGravatar Florian Lefebvre 2-2/+2 2025-03-26fix(astro): dynamically import actions (#13510)Gravatar Florian Lefebvre 12-51/+96 2025-03-26[ci] formatGravatar Matt Kane 2-2/+2 2025-03-26fix: cache raw cookie value and decode when getting (#13485)Gravatar Matt Kane 3-17/+37 2025-03-25fix: update vite (#13505)Gravatar Emanuele Stoppa 16-104/+123 2025-03-24[ci] formatGravatar Emanuele Stoppa 1-1/+1 2025-03-24fix(app): call renderer when routes don't match (#13483)Gravatar Emanuele Stoppa 4-1/+30 2025-03-21[ci] release (#13460)astro@5.5.4@astrojs/vercel@8.1.3@astrojs/tailwind@6.0.1@astrojs/svelte@7.0.7@astrojs/preact@4.0.6@astrojs/cloudflare@12.3.0Gravatar Houston (Bot) 45-118/+119 2025-03-21fix: better error handling on Stackblitz (#13484)Gravatar Matt Kane 2-0/+12 2025-03-21Repair server islands to work with client router (#13481)Gravatar Martin Trapp 2-6/+11 2025-03-21fix: generate correct external redirects (#13480)Gravatar Matt Kane 3-4/+21 2025-03-21fix(deps): update all non-major dependencies (#13440)Gravatar renovate[bot] 24-435/+436 2025-03-21[ci] formatGravatar Florian Lefebvre 2-2/+2 2025-03-21feat(cloudflare): global env (#13444)Gravatar Florian Lefebvre 6-47/+130 2025-03-21fix(deps): update astro client runtimes (#13474)Gravatar renovate[bot] 7-345/+348 2025-03-20Small change to linking style (#13472)Gravatar Chris Swithinbank 1-1/+1 2025-03-20Add deprecation notice to Tailwind integration README (#13471)Gravatar Chris Swithinbank 2-6/+11 2025-03-20[ci] formatGravatar Matt Kane 2-2/+1 2025-03-20fix(preact,svelte): empty target container before rendering `client:only` isl...Gravatar Matt Kane 5-5/+41 2025-03-20chore(renovate): group updates (#13466)Gravatar Emanuele Stoppa 1-11/+58 2025-03-19[ci] formatGravatar Matt Kane 1-3/+2 2025-03-19fix: don't attempt to move files after build with base (#13463)Gravatar Matt Kane 8-13/+66 2025-03-19[ci] formatGravatar Emanuele Stoppa 2-6/+18 2025-03-19fix(routing): don't add site to static redirects (#13447)Gravatar Emanuele Stoppa 7-10/+49 2025-03-18[ci] formatGravatar Matt Kane 2-2/+1 2025-03-18fix: set correct statusText for custom error pages (#13457)Gravatar Matt Kane 4-2/+19 2025-03-18chore(deps): update github-actions (#13459)Gravatar renovate[bot] 9-13/+13 2025-03-18chore(deps): update github-actions (#13458)Gravatar renovate[bot] 1-5/+5 2025-03-18[ci] formatGravatar Emanuele Stoppa 1-1/+3 2025-03-18chore: remove deprecated package (#13455)Gravatar Emanuele Stoppa 3-23/+16 2025-03-18fix(deps): update dependency miniflare to v4 (#13441)Gravatar renovate[bot] 2-31/+31