Next.jsのカスタムサーバーとしてexpressを使用しています。製品のリストにある製品をクリックすると、すべてが順調です
ステップ1:製品のリンクをクリックします
ステップ2:データベース内の製品を表示します。
ただし、/products
ページ、このエラーが発生します
サーバーコード(/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
エラーが示すように、作成しているfetch
には絶対URLを使用する必要があります。私は、コードを実行できるさまざまな環境(クライアントとサーバー)と関係があると思います。この場合、相対URLは明示的ではなく、十分に信頼できません。
これを解決する1つの方法は、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
}
}
ケース1.エラーではありません。 isomorphic-unfetchはSSRモードで実行されているため、バックエンドはブラウザーの設定を認識していないため、Node.jsはそこからフェッチする絶対URLを知る必要があります。
ケース2.別のシナリオは、httpホストポイズニングヘッダー攻撃を防ぐことです。
それを含むリンクに秘密鍵とトークンを追加します。
<a href="http://_SERVER['Host']?token=topsecret"> (Django, Gallery, others)
....スクリプトを直接インポートすることもできます。
<script src="http://_SERVER['Host']/misc/jquery.js?v=1.4.4">
ケース3. isomorphic-unfetch
データをフェッチするために使用するライブラリです。これはブラウザフェッチAPIのシンプルな実装ですが、クライアント環境とサーバー環境の両方で機能します。