1. ホーム
  2. reactjs

[解決済み] Next.js - エラー: 絶対Urlのみサポートされています。

2022-03-02 15:11:14

質問

next.jsのカスタムサーバーとしてexpressを使用しています。すべてうまくいっているのですが、商品をクリックして商品一覧を表示させると

ステップ1 : 製品リンクをクリックする

ステップ2 : データベースに登録されている商品が表示されます。

しかし /products ページで、次のエラーが発生します。

サーバーコード(Look at /products エンドポイント)

app.prepare()
.then(() => {
  const server = express()

  // This is the endpoints for products
  server.get('/api/products', (req, res, next) => {
    // Im using Mongoose to return the data from the database
    Product.find({}, (err, products) => {
      res.send(products)
    })
  })

  server.get('*', (req, res) => {
    return handle(req, res)
  })

  server.listen(3000, (err) => {
    if (err) throw err
    console.log('> Ready on http://localhost:3000')
  })
})
.catch((ex) => {
  console.error(ex.stack)
  process.exit(1)
})

ページ - products.js (商品のjsonデータをループさせるシンプルなレイアウト)

import Layout from '../components/MyLayout.js'
import Link from 'next/link'
import fetch from 'isomorphic-unfetch'

const Products = (props) => (
  <Layout>
    <h1>List of Products</h1>
    <ul>
      { props.products.map((product) => (
        <li key={product._id}>{ product.title }</li>
      ))}
    </ul>
  </Layout>
)

Products.getInitialProps = async function() {

  const res = await fetch('/api/products')
  const data = await res.json()

  console.log(data)
  console.log(`Showed data fetched. Count ${data.length}`)

  return {
    products: data
  }
}

export default Products

解決方法は?

エラーにあるように、絶対URLで fetch を作成しています。これは、あなたのコードが実行される環境(クライアントとサーバー)が異なることと関係があると推測しています。相対URLは、この場合、明示的でなく、信頼性が十分でないだけです。

これを解決する一つの方法は、サーバーのアドレスをハードコードして fetch を設定するか、あるいは config モジュールで、環境に反応します。

/config/index.js

const dev = process.env.NODE_ENV !== 'production';

export const server = dev ? 'http://localhost:3000' : 'https://your_deployment.server.com';

products.js

import { server } from '../config';

// ...

Products.getInitialProps = async function() {

  const res = await fetch(`${server}/api/products`)
  const data = await res.json()

  console.log(data)
  console.log(`Showed data fetched. Count ${data.length}`)

  return {
    products: data
  }
}