Next.js ошибка предварительной отправки в getStaticPaths

#javascript #next.js

#javascript #next.js

Вопрос:

Я создаю Next.js приложение. Вот моя файловая структура:

 cpanearme
 -components
   -listitem.js
 -pages
    -home
       -index.js
     -firm
        -[id].js
 

Вот код для элемента списка, который переходит к динамическому маршруту:

      <a className='lead'
      onClick={() => {
        router.push({
          pathname: `/firm/${firm.id}`,
          query: { data: firm.id},
        })
      }}
    >View Their Profile and Reviews</a>   
 

Вот вся динамическая страница целиком

 import { withRouter } from 'next/router'
import Image from 'next/image'
import Link from 'next/link'
import StickyNavbar from '../../components/StickyNavbar'
import ReviewItem from "../../components/ReviewItem"
import Footer from '../../components/Footer'
import path from "path"
import fs from "fs"

const Profile = (props) => {
  const firm = props.firms[0].filter(firm => firm.id === props.router.query.id)[0]

    return (
        <div>
            <StickyNavbar/>
            <div className='container ' style={{backgroundColor:'#b0bec5'}}>
                <h3 className='text-primary'>{firm.name}</h3>
                <i>Founded {firm.years} ago</i>
     
                <div className="grid-3a">
                    <div className="card p-3">
                        Conact Info:<br/>  
                        {firm.address} <br/>
                        {firm.city}, {firm.state} <br/>
                        {firm.email} <br/>
                        {firm.phone}<br/>
                    </div>
                    <div>
                        <h3 className='lead text-primary text-center'>About this company:</h3><br/>
                        <p style={{textIndent:'10px'}} className='py-1'>{firm.profileCopy}</p>
                      </div>
                      <div>
                          <br/>
                          <br/>
                         On The Web: <br/>
                         <a href={firm.website} className='lead' >Their Site</a> <br/> 
                         <a href={firm.bbb} className='lead' >Their BBB</a>  
                      </div>
                </div>
                <br/>
                <div > <h3 className='text-center text-primary lead'> Meet The CPA </h3><br/>
                       <h4 className='text-center text-secondary lead'>{firm.cpa}</h4>
                        <div className='all-center round-img'>
                            <Image
            src={firm.cpapic}
            alt='Tax Expert CPA'
            className='round-img'
              width= "100px"
              height= "100px"
         
 
          /> </div> 
          <div className="mx-3">
              <p style={{textIndent:'10px'}}>{firm.cpabio}</p>
              </div>   
                
                </div>

        <br/>
        <br/>
                <div>
                   <h3 className='text-center text-primary lead'>Pros and Cons</h3>
                    <div className="grid-2">
                        <div className='card all-center'>Pros: <br/>
                        <ul>{firm.pros.map(pro=> (<li><i class="fas fa-plus"></i>{' '}{pro}</li>))}</ul>
                        </div>
                        <div className='card all-center'>Cons: <br/>
                        <ul>{firm.cons.map(con=> (<li><i class="fas fa-minus"></i>{' '}{con}</li>))}</ul>
                        </div>
                    </div>
                    </div>
<br/>
<br/>
                 <div><h3 className='text-center text-primary lead'>Services offered</h3> 
                    <div className="grid-3">
                        <div className='card'>Federal Tax : <br/>
                        <ul>{firm.services.federal.map(fed=> (<li><i class="fas fa-check"></i>{' '}{fed}</li>))}</ul>
                        </div>
                        <div className='card'>State Tax: <br/>
                        <ul>{firm.services.state.map(state=> (<li><i class="fas fa-check"></i>{' '}{state}</li>))}</ul>
                        </div>
                        <div className='card'>Accounting: <br/>
                        <ul>{firm.services.accounting.map(account=> (<li><i class="fas fa-check"></i>{' '}{account}</li>))}</ul>
                        </div>
                    </div>
                 </div>          
  <br/>
  <br/>
              <div>
                  <h3 className='text-center text-primary lead'>More About Their Fees:</h3>
                  
                    
   
                  <div className='text-center'> 
                  <h3>Pricing Information</h3>         
                     Minimum Debt: {firm.minimum} <br/>
                     Average Fees: {firm.cost} <br/>
                     Exploration Cost: {firm.exploration} <br/>
                     Average Client Savings: {firm.avgsavings}</div>
                
                  <p style={{textIndent:'10px'}}>{firm.fees}</p>
              </div>
<br/>
 <br/>                         <div>
                  <h3 className='text-center text-primary lead'>Read Real Customer Reviews:</h3>
                  <div className='all-center'>
                  {firm.reviews.map((review,i)=> (<ReviewItem review={review} key={i}/>))}
                  </div>
              </div>
            </div> 
            <Footer/>
        </div>
    )
  }

export default withRouter(Profile)

export async function getStaticPaths() {

    const postsDirectory = path.join(process.cwd(), 'firms')
    const filenames = fs.readdirSync(postsDirectory)

    const firms = filenames.map((filename) => {
    const filePath = path.join(postsDirectory, filename)
    const firms =  JSON.parse(fs.readFileSync(filePath, 'utf8'))

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

    return firms
    
  })

  return {
   paths: firms[0].map(firm =>({ params: { id: firm.id}})), //firms[0].map(firm => { params: { id: firm.id}}),
   fallback: true // See the "fallback" section below
  };
}

export async function getStaticProps() {
  // Call an external API endpoint to get posts.
  // You can use any data fetching library
  const postsDirectory = path.join(process.cwd(), 'firms')
  const filenames = fs.readdirSync(postsDirectory)


  const firms = filenames.map((filename) => {
    const filePath = path.join(postsDirectory, filename)
    const firms =  JSON.parse(fs.readFileSync(filePath, 'utf8'))

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

    return firms
    
  })

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

Я нахожусь на этапе сборки, и после настройки я сталкиваюсь со следующей ошибкой getStaticPaths . Я не могу понять, как найти в Google эту точную ошибку.

 Error: Export encountered errors on following paths:
        /firm/[id]
        /taxfaqs/[id]
 

Он успешно предварительно отображает все, что передается с помощью get static props, но я не знаю, как сообщить build, что [id] это не то, что нужно проверять.

Так ли это [...id] ?

Ответ №1:

Кажется, есть некоторая путаница в том, как getStaticPaths и getStaticProps работать.

getStaticPaths используется в динамических маршрутах (например, в вашем /firm/[id] ) для определения списка путей, которые должны быть отображены в HTML во время сборки. Это означает, что вам нужно вернуть из него массив возможных путей для этого маршрута.

 // Generates `firm/firm1` and `firm/firm2` paths at build time
export async function getStaticPaths() {
    return {
        paths: [
            { params: { id: 'firm1' } },
            { params: { id: 'firm2' } }
        ],
        fallback: true
    };
}
 

getStaticProps затем будет генерироваться реквизит для каждой страницы на основе путей, возвращаемых getStaticPaths во время сборки.

 // Generates the props for given path at build time
export async function getStaticProps({ params }) {
    // Add your own logic to retrieve the data for given path and pass it to `firm`
    // If the route is like `/firm/firm1`, then params.id is `firm1`
    return {
        props: {
            firm
        }
    };
}
 

Наконец, в вашем компоненте страницы вы можете получить доступ к данным, переданным из реквизитов.

 const Profile = ({ firm }) => {
    // `firm` will contain the data for a given path
}
 

Комментарии:

1. я обычно нарушаю правила, чтобы заставить вещи работать, только чтобы узнать, что вы не можете этого сделать. в основном это передавалось в параметрах prop спасибо!

2. итак, я исправил свои getStaticPaths и getStaticProps, но во время сборки он все еще хочет попытаться также скомпилировать нестатическую версию и выдает мне ту же ошибку. «Экспортируйте обнаруженные ошибки по следующим путям: /firm/[id] /taxfaqs/[id]»

3. неважно… его запасной вариант: false, поскольку я загружаю весь массив в getStaticRoutes