26
Chapter 26
getStaticProps Details
Here is some essential information you should know about getStaticProps
.
Fetch External API or Query Database
In lib/posts.js
, we’ve implemented getSortedPostsData
which fetches data from the file system. But you can fetch the data from other sources, like an external API endpoint, and it’ll work just fine:
export async function getSortedPostsData() {
// Instead of the file system,
// fetch post data from an external API endpoint
const res = await fetch('..');
return res.json();
}
Note: Next.js polyfills
fetch()
on both the client and server. You don't need to import it.
You can also query the database directly:
import someDatabaseSDK from 'someDatabaseSDK'
const databaseClient = someDatabaseSDK.createClient(...)
export async function getSortedPostsData() {
// Instead of the file system,
// fetch post data from a database
return databaseClient.query('SELECT posts...')
}
This is possible because getStaticProps
only runs on the server-side. It will never run on the client-side. It won’t even be included in the JS bundle for the browser. That means you can write code such as direct database queries without them being sent to browsers.
Development vs. Production
- In development (
npm run dev
oryarn dev
),getStaticProps
runs on every request. - In production,
getStaticProps
runs at build time. However, this behavior can be enhanced using thefallback
key returned bygetStaticPaths
Because it’s meant to be run at build time, you won’t be able to use data that’s only available during request time, such as query parameters or HTTP headers.
Only Allowed in a Page
getStaticProps
can only be exported from a page. You can’t export it from non-page files.
One of the reasons for this restriction is that React needs to have all the required data before the page is rendered.
What If I Need to Fetch Data at Request Time?
Since Static Generation happens once at build time, it's not suitable for data that updates frequently or changes on every user request.
In cases like this, where your data is likely to change, you can use Server-side Rendering. Let's learn more about server-side rendering in the next section.
Was this helpful?