Skip to content

Commit

Permalink
Add section on reading files
Browse files Browse the repository at this point in the history
  • Loading branch information
timneutkens committed Mar 15, 2020
1 parent 4cac93a commit d457cce
Showing 1 changed file with 59 additions and 0 deletions.
59 changes: 59 additions & 0 deletions docs/basic-features/data-fetching.md
Expand Up @@ -94,6 +94,65 @@ export const getStaticProps: GetStaticProps = async context => {
}
```

### Reading files: Use `process.cwd()`

Files can be read directly from the filesystem in `getStaticProps`.

In order to do so you have to get the full path to a file.

Since Next.js compiles your code into a separate directory you can't use `__dirname` as the path it will return will be different from the pages directory.

Instead you can use `process.cwd()` which gives you the directory where Next.js is being executed.

```jsx
import fs from 'fs'
import path from 'path'

// posts will be populated at build time by getStaticProps()
function Blog({ posts }) {
return (
<ul>
{posts.map(post => (
<li>
<h3>{post.filename}</h3>
<p>{post.content}</p>
</li>
))}
</ul>
)
}

// This function gets called at build time on server-side.
// It won't be called on client-side, so you can even do
// direct database queries. See the "Technical details" section.
export async function getStaticProps() {
const postsDirectory = path.join(process.cwd(), 'posts')
const filenames = fs.readdirSync(postsDirectory)

const posts = filenames.map(filename => {
const filePath = path.join(postsDirectory, filename)
const fileContents = fs.readFileSync(fullPath, 'utf8')

// Generally you would parse/transform the contents
// For example you can transform markdown to HTML here

return {
filename,
content: fileContents,
}
})
// By returning { props: posts }, the Blog component
// will receive `posts` as a prop at build time
return {
props: {
posts,
},
}
}

export default Blog
```

### Technical details

#### Only runs at build time
Expand Down

0 comments on commit d457cce

Please sign in to comment.