【问题标题】:Next.js dynamic route - 404 on page reload after added SLUGNext.js 动态路由 - 添加 SLUG 后页面重新加载时出现 404
【发布时间】:2020-06-20 14:32:04
【问题描述】:

我的项目使用 Next.js 和 Node.js。

我们拥有的: 页面结构:

页面/产品/PageSomeName.js

页面/产品/PageEnotherName.js

页面/产品/PageName.js

产品文件夹中的页面名称可以不同

routes.js

routes.add("/products/:id", "/products/[id].js");

server.js

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

  server.use(
    "./images",
    express.static(path.join(__dirname, "images"), {
      maxAge: dev ? "0" : "365d"
    })
  );

  server.use(bodyParser.json());

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

  const PORT = process.env.PORT || 9001;

  server.listen(PORT, err => {
    if (err) throw err;
    console.log(`> Read on http://${process.env.SITE_URL_FULL}`);
  });
});

链接组件

 <Link href={`/products/${data.link}`} as={`/products/${data.slug}`}/>

数据数组

export const storeProducts = [
  {
    id: 1,
    title: "Title1",
    link: "product_name_some",
    slug: "product-1-slug",
  },
  {
    id: 2,
    title: "Title2",
    link: "product_name_different_some_name",
    slug: "product-2-slug"
  },

为链接添加 slug 时出现问题。

在客户端,一切正常。我在浏览器网址中使用 localhost:3000/product-2-slug 。但是重新加载后,我从 Next.js 获取 404 错误页面

我必须在 server.js 中的服务器端添加什么才能正常重新加载服务器? 也许我需要在 routes.js

中更改 Link 组件或 next-route 设置

谢谢!

【问题讨论】:

    标签: node.js reactjs express next.js


    【解决方案1】:

    server.js 中应该有如下路由。

    server.get("/products/product1", (req, res) => {
        return handle(req, res);
    });
    
    server.get("/products/product2", (req, res) => {
        return handle(req, res);
    });
    
    server.get("/products/product3", (req, res) => {
        return handle(req, res);
    });
    

    处理同样问题的一个好方法是在 pages 目录和服务器句柄上创建一个通用的 products.js,如下所示。

    server.js

    server.get("/products/:id", (req, res) => {
        return handle(req, res, { id: req.params.id });
    });
    

    pages/products.js 我们可以创建一个 getInitialProps 方法

    static getInitialProps (context) {
        // parameters reqturned from server are accessible via
        const id = ctx.query.id
    }
    

    【讨论】:

    • 感谢您的快速回复。我改变了对问题的一点描述。文件夹中的文件可以有不同的名称,最后我需要为每个产品的链接添加 slug 参数。在客户端一切正常,我使用 url fir slug,但在重新加载页面后我使用 404。
    • 嗨@Pawel Gronski,你找到解决这个问题的方法了吗?
    猜你喜欢
    • 2019-07-20
    • 2019-07-27
    • 2019-12-17
    • 1970-01-01
    • 2021-06-05
    • 2018-10-05
    • 2022-12-09
    • 2023-03-03
    • 2021-07-11
    相关资源
    最近更新 更多