我正在使用nextjs和graphql进行购物概念证明。
我有一个显示产品列表的组件,其中包含指向产品页面的链接
<Link
as={`${handle}/product/${url}`}
href={`/product?id=${item.id};`}>
<a>{item.title}</a>
</Link>
handle是集合名称,因此浏览器中的url看起来像http://localhost:3000/new-releases/product/Plattan-2-Bluetooth,但在幕后它实际上只是使用了一个名为products的页面,我传递的是产品ID。
现在在product.js中(粘贴在下面),我得到id的查询字符串值,并做另一个查询来得到产品。所有的工作都很好,但如果我点击刷新或复制并粘贴URL到一个新的窗口,我得到404。
我知道这是一些与路由,但我不知道我需要做什么来解决这个问题。谢谢
import React, { Component } from 'react';
import PropTypes from 'prop-types';
import { Query } from 'react-apollo';
import gql from 'graphql-tag';
class product extends Component {
static async getInitialProps({query}) {
console.log("query", query)
return query ? { id: query.id.replace(';', '') } : {}
}
render() {
const PRODUCT_FRAGMENT = gql`
fragment ProductPage on Product {
title
description
descriptionHtml
id
images(first: 10, maxWidth: 600) {
edges {
node {
id
altText
originalSrc
}
}
}
}
`;
const PRODUCT_FETCH_QUERY = gql`
query PRODUCT_FETCH_QUERY {
node(id: "${this.props.id}") {
__typename
...ProductPage
}
}
${PRODUCT_FRAGMENT}
`;
return (
<div>
<Query query={PRODUCT_FETCH_QUERY}>
{({ data, error, loading }) => {
console.log("data", data)
if (loading) return <p>Loading...</p>
if (error) return <p>Error: {error.message}</p>
return null}
}
</Query>
</div>
);
}
}
product.propTypes = {
};
export default product;
2条答案
按热度按时间kxe2p93d1#
您可以在项目根目录下名为 next.config.js 的文件中尝试这些方法
检查此链接
lokaqttq2#
这是因为当您使用
next/link
组件时,href
prop具有指向设置了项ID的查询参数的页面的“真实的”URL。这意味着在客户端(浏览器)上,Next.js可以加载带有数据查询参数的正确页面(您的product.js页面)。但是当您从服务器加载时,无论是通过重新加载页面还是在新窗口中打开它,Next.js都不知道要加载哪个页面,在这种情况下,我认为它将尝试查找文件
./pages/new-releases/product/Plattan-2-Bluetooth.js
,当然该文件并不存在。如果你想拥有这些类型的URL,你必须确保请求也被路由到服务器上的正确页面文件(
./pages/product.js
)。你可以通过创建一个自定义服务器来做到这一点。在Next.js存储库中有一堆examples,其中一个使用Express。这也在该网站的“学习”部分的一个名为Server Side Support for Clean URLs的教程中进行了介绍如果您决定使用“快速”,则最终结果将类似于:
这将呈现产品页面,并且您将在
getInitialProps()
中的query
对象上获得productUrl
。当然,现在您将需要使用该对象而不是产品ID来获取数据。