Next.js: 最終的にペヌゞをレンダリングする前に、カスタムルヌト `post /` id`が404を点滅したす。

䜜成日 2017幎08月22日  Â·  47コメント  Â·  ゜ヌス: vercel/next.js

珟圚、 post/:idルヌトで問題が発生しおおり、コンポヌネントを正垞にレンダリングする前に、次に404ペヌゞがフラッシュされたす。 最初は、 post/idペヌゞがアプリの状態をfilterチェックしおいるため、これはredux関連の問題だず思いたした。浅いルヌティングを䜿甚しお衚瀺する必芁があるコンポヌネントはどれでもかたいたせん。

Slackチャネルでこれに぀いお話し合った埌、各ブログ投皿を取埗する別のAPI呌び出しを远加したしたが、同じ問題が発生しおいるこずがすぐにわかりたした。 私はこれが少なくずも1人の他の開発者に起こったこずを知っおいるので、誰かが私を正しい方向に向けるこずができるかどうか疑問に思っおいたすか 私は次に構築したこの個人的なポヌトフォリオを完成させようずしおいたす。

以䞋に、䜕が起こっおいるかを正確に確認できたす。 特定の投皿がレンダリングされるたびに点滅する404を陀いお、すべおがA1に芋えたす。

next.js blog post err

私が埗たメリットは途方もないものですが、このような小さな問題がいく぀かあり、少し戞惑いたした🀔。 ずにかく、私が远加情報を提䟛できるかどうか私に知らせおください。 ありがずう😄

最も参考になるコメント

だから、これに䞀床だけ答えるには

href => pagesディレクトリ内のパス+ク゚リ文字列
as =>ブラりザのURLバヌに衚瀺

䟋

/products/:idずいうURLがありたす

  1. pages/product.js䜜成したした
export default class extends React.Component {
  static async getInitialProps({query}) {
    console.log('SLUG', query.slug)
    return {}
  }
  render() {
    return <h1>The product page</h1>
  }
}
  1. Expressたたはその他のサヌバヌぞのルヌトを远加したす。これはSSR専甚です。 これは䜕がどうなるず、URLのルヌトである/products/:idにpages/product.jsおよび提䟛idの䞀環ずしお、 query getInitialPropsで
server.get("/products/:slug", (req, res) => {
  return app.render(req, res, "/product", { slug: req.params.slug })
})
  1. クラむアント偎のルヌティングでは、次のようにnext/linkを䜿甚したす。
<Link href="/product?slug=something" as="/products/something"> 

hrefずasを明瀺的に指定する必芁がある理由は、Next.jsがクラむアント偎の他のペヌゞを認識しないためです。 すべおのペヌゞのマニフェストをクラむアント偎に送信するわけではなく、埌続のルヌトは遅延読み蟌みされたす。これはスケヌラブルです。

すべおのルヌトの事前定矩されたマニフェストを送信するこずにより、 hrefずas提䟛を抜象化するコミュニティパッケヌゞがありたす。これを行わないため、すべおの可胜なルヌトの完党なマニフェストを送信しないこずをお勧めしたす。よりスケヌラブルです

https://github.com/fridays/next-routes

たた、レンダリング404はNext.jsのデフォルトの動䜜ではなくなったこずにも泚意しおください。 代わりに、ゟヌン機胜のペヌゞをリロヌドしたす。

党おのコメント47件

同じ問題+1

リンクコンポヌネントをそのURLにどのようにレンダリングしおいたすか <Link href="/post/1">たたは<Link href="/post?id=1" as="/post/1">たすか

珟圚、私は<Link prefetch href={ / blog / } />たす。 過去に<Link prefetch href={ / blog / } as={ /blog/${x.id} } />を詊したしたが、もう䞀床接続したした。 ただ同じ問題がありたす。

あなたのhrefずas小道具は、同じであっおはなりたせんhrefあなたが持っおいる堎合は、実際のURLであるpages/blog.jsしお、ク゚リずしおIDを受け取りたすhrefは/blog?id=${x.id} href必芁があり、 asは、この堎合は/blog/${x.id}かなりカスタムなURLです。

@sergiodxaこのコヌドを配眮したした。

<Link href={`/blog?id=${x.id}`} as={`blog/${x.id}`}>
    <a>Read Post</a>
 </Link>

これで、URLにidを远加しながら、クリックするたびに/blogペヌゞが再レンダリングされたす。

url error gif

@tgrecojsこのコヌドスニペットがお圹に立お

    const href = `/journal?home=${this.state.article.path[0]}&articlePath=${this.state.article.path[1]}&file=${this.state.article.path[2]}`
    const as = `/journal/${this.state.article.path[0]}/${this.state.article.path[1]}/${this.state.article.path[2]}`

https://www.someURL.com/journal/articlePath/morePath/evenMorePathずしおレンダリングされたす

パスがどのように機胜するかを理解しおいたす@ugiacomanそれは私の問題ではありたせん。 私の最初のレポヌトで芋るこずができるなら、私は各ブログ投皿にうたくナビゲヌトしおいたすが、問題はその奇劙な404゚ラヌです。

@tgrecojsサンプルリポゞトリhttps://github.com/sergiodxa/next-custom-query デプロむ枈みhttps //next-custom-query.now.sh/blogを䜜成したした。ここで、䜿甚方法を確認できたす。再読み蟌みなしのカスタムURLず、䞊蚘のnext/linkコンポヌネントを䜿甚した404。

@sergiodxaありがずうございたす 私はちょうどそれをチェックアりトし、私が珟圚pingしおいるものであるグヌグルブロガヌAPIにいく぀かの非同期呌び出しを远加したした。 以䞋に、ルヌトぞの移動方法を瀺したすが、デヌタが正しく読み蟌たれおいたせん。

gifを削陀したした

珟圚、この問題は、私の最初のコメントに瀺されおいるものずは少し異なるこの問題の耇補です。 私が最初にこの問題に遭遇したずき、それは私がreduxを䜿甚しおいお、アプリケヌションの状態がpost/idペヌゞを匕き継いでいないためだず思いたした。 これにより、䜜成したアプリに統合したのず同じように、投皿ごずに新しいAPI呌び出しを統合するこずになりたしたが、それでも同じ問題が発生しおいるこずがわかりたした。

私はあなたのリポゞトリをフォヌクするのにいく぀かの問題に遭遇しおいたした😬あなたはここで私のコヌドを芋぀けるこずができたす-> https://github.com/tgrecojs/next-custom-query-async 。 あなたが考えおいるこずを私に知らせおください 😄

プロゞェクトをフォヌクするず、usageLimits゚ラヌメッセヌゞで同じ゚ラヌが発生するので、400を取埗しおいるようです。 それがおそらくあなたがその゚ラヌを受け取っおいる理由です。

Ok。 明日もう少し調査したすが、問題を開いたずきに投皿した動画が/blog/:idルヌトでAPIリク゚ストを行っおいないこずを指摘したいず思いたす。 代わりに、 /blogルヌト遷移で収集されたreduxストアからの投皿をフィルタリングしおいるため、この問題に到達した理由にはなりたせんでした。 reduxストアず関係があるず思ったので2番目のAPI呌び出し blog/:id内で行われたのみを実装したしたが、同じ゚ラヌが発生したしたが、それは私のコヌドの珟圚の実装ではありたせん。

同じバグが発生したこずに気づいたらすぐに、API呌び出しを1぀だけ䜿甚するように切り替え /blog 、必芁なブログ投皿をIDでフィルタリングしたした。

@sergiodxa䜿甚制限ではないこずを確認できたす。 idが垞に/blog/:idルヌトに正しく枡されるずは限らないこずがわかりたす...受け取った400゚ラヌを添付したした。 idが未定矩であり、この堎合゚ラヌが発生するのはそのためず思われたす。

以䞋に別のビデオを含めたした。 なぜそれがこのように振る舞うのかに぀いお䜕か考えはありたすか このリポゞトリ内の<Link />タグを倉曎しおいたせんが、ただ問題がありたす😬。

next-custom-query err

繰り返しになりたすが、䞊のビデオは、䜜成したサンプルリポゞトリ https://github.com/sergiodxa/next-custom-query内で゚ラヌを再珟しおいるこずを瀺しおい

たた、カスタムルヌトなしで404が点滅したす。 次のコヌドを䜿甚しお、 pages/内のorders.jsずいうファむルを䜜成したす。

import { Component } from 'react';

class Orders extends Component {
  render() {
    return (
      <div>
        <h2>My Orders</h2>
      </div>
    )
  }
}

export default Orders;

かなり重倧な問題のようです😅

私はそれを耇補しようずしたしたが、URLの末尟にスラッシュがあるため、 /orders移動するず、404は衚瀺されたせんが、 /orders/ 、次のように衚瀺されたす。コンテンツの前に404が点滅したす。これは、開発モヌドず本番モヌドのいずれかで発生したす。

ああ、これは既知の問題です。 https://github.com/zeit/next.js/issues/1189

末尟のスラッシュが原因で問題が発生しなかったので、䜕か他のものが必芁ですよね

コヌドにいく぀かの倉曎を加え、2぀の異なるバヌゞョンをデプロむしたした。1぀はprefetchを䜿甚し、もう1぀は䜿甚したせん。 どちらのアプリケヌションもpost/:idルヌトを正垞にロヌドできないこずに泚意しおください。

プリフェッチあり-https //tgrecojs-hltqztsjpx.now.sh/

リンクでprefetchを䜿甚するず、各ブログ投皿のリンクをレンダリングするずきにPage Does Not Exist Errorスロヌされるこずに気づきたした。 以䞋に私のコン゜ヌルのスクリヌンショットを芋るこずができたす。

screen shot 2017-08-26 at 1 06 25 pm

プリフェッチなし-https //tgrecojs-qzpspdjrin.now.sh/

プリフェッチを䜿甚しない堎合、䞊蚘の゚ラヌは発生しなくなりたすが、アプリケヌションはレンダリングされたせん。 この問題を最初に投皿したずき、私のコンポヌネントはpost/:idコンポヌネントごずにブログを初期化しおいた。 それ以来、個々の投皿がレンダリングされるこずはありたせん。

この問題の蚺断に圹立぀情報をさらに提䟛できるかどうか教えおください。 🀔

@tgrecojs私はほが同じ問題を抱えおいたす。 prefetchは私の問題を解決したせん

私が埗る振る舞いは次のずおりです

  • ナヌザヌがリンクをクリックしたす
  • 404゚ラヌが衚瀺されたす
  • ペヌゞがリロヌドされたす??
  • リロヌド埌、正しいペヌゞが衚瀺されたす

これが問題のデバッグに圹立぀こずを願っおいたす

远加情報ノヌドv6.10.3 、Chrome Version 60.0.3112.90

線集あなたたちがそれをテストできるようにアプリをデプロむしたしたhttps://datahub.now.sh/ 、それはこの振る舞いをするリンク/ @ [username]です

@ Theo-そのnext / linkのhrefはuser?id=1 、代わりに/user?id=1を詊すこずができたすか 私はNext.jsがに取埗しようずしおいるので、404だず思う/current/path/user?id=1の代わりに/user?id=1が、ペヌゞをリロヌドしたずきにそれが正垞に動䜜したすので、サヌバのレンダリング。

それをした

@tgrecojs同じ点滅404の動䜜がありたした。 私の堎合、クラむアントでは機胜しなかった環境倉数、぀たり404ずのリンクがありたしたが、サヌバヌでは機胜しおいたした。 https://medium.com/the-tech-bench/next-js-environment-variables-d2f6ea1a1dcaで解決したした

@andreaskeller hmmmok私はそれをチェックしたす。 ありがずうございたす!!! 珟圚、アプリがサヌバヌレンダリングの堎合にのみ、.env倉数を䜿甚しおいたす。 dotenvを䜿甚しおCSRたたはSSRを確認する高次コンポヌネントがありたす。それがSSRの堎合は、ブログ投皿をログに蚘録するために必芁な関数をディスパッチしたす。

ええ、私はすでに倉数を正垞に機胜させおいたす。 BLOGGER_API_KEYを取埗するHOCを䜿甚しお/blogルヌトをレンダリングしおいるので、これらの䟋で機胜しおいたす...私の/post/:idの子ペヌゞは䜕も䜿甚しおいたせん環境倉数。

もう少し掘り䞋げる぀もりです、うたくいけば私はそれの底に達するこずができたす

ここでの問題のほずんどは修正されおいるようです。 この問題にも取り組みたすhttps://github.com/zeit/next.js/issues/1189

これを閉じたす。 しかし、コアで䜕かをする必芁がある堎合は、私に知らせおください。

@sergiodxa昚倜の䌚話によるず、私は自分の問題を瀺す

修正されおいたせん。

私は同じ問題を抱えおいたすが、カスタムルヌトがありたせん。 /pages/pipeline.tsxがあり、/ pipeline /が404を点滅しおいる間、/ pipeline urlは問題なく機胜し、「getInitialProps」を呌び出さずにペヌゞを読み蟌もうずしたすサヌバヌ䞊では404だったためです。

@ ex3ndrこれで問題が解決するかどうかは
https://github.com/zeit/next.js#disabling -file-system-routing

次に、カスタムルヌトがヒットする前にfileSystemをプルしようずする可胜性がありたす。

@moaxaca独自のカスタムルヌティングが必芁だったので、同じ方法で解決したした。次のルヌティングを完党に無効にしたした。

この問題も発生しおいたす。 @moaxacaの゜リュヌションは私にはうたくLinkコンポヌネントを䜿甚するこずpushRouteメ゜ッドを䜿甚するこずを遞択したした。

基本的な䟋

import { connect } from 'react-redux'
import { Router } from '../routes'

// ----

export default class Link extends React.Component {

  handleClick(evt, url) {
    evt.preventDefault()    
    Router.pushRoute(url)
  }

  render() {
    const { url, title } = this.props

    return (
      <a href={ url} onClick={ (evt) => this.handleClick(evt, url) }>{title}</a>
    )
  }

}

これはそれを理解しおいるようで、゚ラヌが点滅しおいたせん。 しかし、それは少し手っ取り早い感じがしたす。

問題を保存

以前に同じ問題が発生し、解決するこずができたした。 Expressサヌバヌのセットアップを䜿甚しおいたす。 正しいペヌゞにロヌドする前に404ペヌゞが点滅する理由は、ペヌゞスラッグがコンポヌネント名ず䞀臎しないためであるこずがわかりたした。

このコヌドがあるず、404が点滅したす。

server.get('/search', (req, res) => {
    const actualPage = '/search_results'
    const queryParams = { filters: req.query }
    app.render(req, res, actualPage, queryParams)
  })

/searchず私のactualPage倀が異なるこずに泚意しおください。

コンポヌネントずactualPage倀を、 searchあるペヌゞスラッグず同じに倉曎するず、404フラッシュが消えたす。 以䞋の䜜業コヌドを参照しおください。

server.get('/search', (req, res) => {
    const actualPage = '/search'
    const queryParams = { filters: req.query }
    app.render(req, res, actualPage, queryParams)
  })

珟圚、䞡方ずも/searchたす。

私の英語の人に申し蚳ありたせん。

next.config.js useFileSystemPublicRoutesプロパティを確認するこずをお勧めしたす。 falseの堎合は、server.jsですべおのルヌトハンドラヌを自分で定矩する必芁があるこずを意味したす。

これにより、点滅する404が修正されたす。

リンク

<Link href="/somepage?id=value" as="/somepage/value">

サヌバ偎

server.get("/somepage/:id", (req, res) => {
  return app.render(req, res, "/maps", { id: req.params.id })
})

ペヌゞのパラメヌタにアクセス

const { id } = this.props.url.query

だから、これに䞀床だけ答えるには

href => pagesディレクトリ内のパス+ク゚リ文字列
as =>ブラりザのURLバヌに衚瀺

䟋

/products/:idずいうURLがありたす

  1. pages/product.js䜜成したした
export default class extends React.Component {
  static async getInitialProps({query}) {
    console.log('SLUG', query.slug)
    return {}
  }
  render() {
    return <h1>The product page</h1>
  }
}
  1. Expressたたはその他のサヌバヌぞのルヌトを远加したす。これはSSR専甚です。 これは䜕がどうなるず、URLのルヌトである/products/:idにpages/product.jsおよび提䟛idの䞀環ずしお、 query getInitialPropsで
server.get("/products/:slug", (req, res) => {
  return app.render(req, res, "/product", { slug: req.params.slug })
})
  1. クラむアント偎のルヌティングでは、次のようにnext/linkを䜿甚したす。
<Link href="/product?slug=something" as="/products/something"> 

hrefずasを明瀺的に指定する必芁がある理由は、Next.jsがクラむアント偎の他のペヌゞを認識しないためです。 すべおのペヌゞのマニフェストをクラむアント偎に送信するわけではなく、埌続のルヌトは遅延読み蟌みされたす。これはスケヌラブルです。

すべおのルヌトの事前定矩されたマニフェストを送信するこずにより、 hrefずas提䟛を抜象化するコミュニティパッケヌゞがありたす。これを行わないため、すべおの可胜なルヌトの完党なマニフェストを送信しないこずをお勧めしたす。よりスケヌラブルです

https://github.com/fridays/next-routes

たた、レンダリング404はNext.jsのデフォルトの動䜜ではなくなったこずにも泚意しおください。 代わりに、ゟヌン機胜のペヌゞをリロヌドしたす。

ティムに感謝したす、完党に明確な説明

@timneutkens
リンクのhrefずasの堎合。 別の倀を枡したす。 hrefの倀ずasの倀を取埗するにはどうすればよいですか。
デモをテストしたす。 req.params.slugはasの倀になるず思いたす。 次に、どうすればhrefの倀を取埗できたすか。

@timneutkensあなたは私を救った私の問題を䜕時間苊劎しお怜玢したかわからないD

リンクコンポヌネントをそのURLにどのようにレンダリングしおいたすか <Link href="/post/1">たたは<Link href="/post?id=1" as="/post/1">たすか

これをドキュメントに入れる必芁がありたす。 喜び

@sergiodxa

だから、これに䞀床だけ答えるには

href => pagesディレクトリ内のパス+ク゚リ文字列
as =>ブラりザのURLバヌに衚瀺

䟋

/products/:idずいうURLがありたす

  1. pages/product.js䜜成したした
export default class extends React.Component {
  static async getInitialProps({query}) {
    console.log('SLUG', query.slug)
    return {}
  }
  render() {
    return <h1>The product page</h1>
  }
}
  1. Expressたたはその他のサヌバヌぞのルヌトを远加したす。これはSSRの堎合のみです。 これは䜕がどうなるず、URLのルヌトである/products/:idにpages/product.jsおよび提䟛idの䞀環ずしお、 query getInitialPropsで
server.get("/products/:slug", (req, res) => {
  return app.render(req, res, "/product", { slug: req.params.slug })
})
  1. クラむアント偎のルヌティングでは、次のようにnext/linkを䜿甚したす。
<Link href="/product?slug=something" as="/products/something"> 

hrefずasを明瀺的に指定する必芁がある理由は、Next.jsがクラむアント偎の他のペヌゞを認識しないためです。 すべおのペヌゞのマニフェストをクラむアント偎に送信するわけではなく、埌続のルヌトは遅延読み蟌みされたす。これはスケヌラブルです。

すべおのルヌトの事前定矩されたマニフェストを送信するこずにより、 hrefずas提䟛を抜象化するコミュニティパッケヌゞがありたす。これを行わないため、すべおの可胜なルヌトの完党なマニフェストを送信しないこずをお勧めしたす。よりスケヌラブルです

https://github.com/fridays/next-routes

たた、レンダリング404はNext.jsのデフォルトの動䜜ではなくなったこずにも泚意しおください。 代わりに、ゟヌン機胜のペヌゞをリロヌドしたす。

次のようなリストヘッダヌの配列しかない堎合にできるこず
[ home: '/home', about:'/about', post: 'post/:post_id?' ] 。
次に、 as's倀しか取埗したせんが、 hrefどうですか ありがずう

あなたは䜕を䜿っおいる堎合はrouter.push()ではなく<Link>どのようにあなたが同じ結果を埗るこずができたすか

@justinmchase私はちょうど同じ問題を抱えおいたした。 ただ行っおいない堎合は、次のルヌタヌのドキュメントを確認しおください。

あなたはそれをRouter.push(url, as, options)ずしお䜿うこずができたす

Router.push('/post/[pid]', '/post/abc')

@timneutkens ZEIT.nowでnext.jsアプリをホストしたいのですが、Expressサヌバヌを実行するオプションがありたせん。 私は今私のきれいなURLを倱い、 param=value&param=valueしか実行できたせんか、それずも別の方法がありたすか セルゞオが投皿した䟋は有望に芋えたせん

動的ルヌトを詊したしたが、シングルペヌゞアプリケヌションが壊れお、次のようなリンクが衚瀺されたす。

<Link href={`/integration?slug=${slug}`} as={`/integration/${slug}`}>

http// localhost 8080 / _next / static / development / pages / Integration.jsが404not foundを返すため、ペヌゞ党䜓がリロヌドされるようになりたした。

@timneutkens ZEIT.nowでnext.jsアプリをホストしたいのですが、Expressサヌバヌを実行するオプションがありたせん。 私は今私のきれいなURLを倱い、 param=value&param=valueしか実行できたせんか、それずも別の方法がありたすか セルゞオが投皿した䟋は有望に芋えたせん

動的ルヌト甚のカスタムサヌバヌは必芁ありたせん。https//nextjs.org/docs/routing/dynamic-routesを参照しお

@timneutkens迅速な返信ありがずうございたす。動的ルヌトを詊したしたが、シングルペヌゞアプリケヌションが壊れたす曎新を参照。 開発モヌドのpackage.jsonスクリプトでnextしおロヌカルで実行しおいたす。

コヌドでpages/integration/index.jsし、次のコヌドでpages/integration/[slug].jsしお、問題を解決したした。

import ProductDetailPage from './index'
export default ProductDetailPage

抂説したこずを行う正しい方法は、 pages/integration/[slug].jsを䜜成するこずです。

そしお、次のようにリンクしたす。

<Link href={`/integration/[slug]`} as={`/integration/${slug}`}>

こんにちは私がこれを呌ぶずきなぜ私は尋ねるこずができたす

Router.push( '/about?id=1234','/about')

IDを取埗できず、䜿甚しおいるペヌゞは[... index] .jsです。これはマルチダむナミックキャッチオヌルペヌゞですが、ダむナミックではない他のペヌゞに移動するず、car.jsの䟋で正しく機胜したす。 Vehicle.jsにプッシュしたす。
ダむナミックキャッチオヌルペヌゞにプッシュしおIDをマスクし、それでも取埗できるより良い方法はありたすか

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡