为什么在NextJS中未定义查询参数?

时间:2019-08-13 23:15:36

标签: javascript reactjs next.js

我正在使用Router(Page)调用页面,并期望页面的变量(该页面称为[category] ​​.js)在初始页面加载时出现。查询本身在那里,键在那里,但是值是'undefined'。在服务器端似乎有一些对getInitialProps的调用,其中未定义2/3。

react组件具有构造函数等,它不是功能组件。

这是我当前的getInitialProps:

Category.getInitialProps = async ({ req, query }) => {
  let authUser = req && req.session && req.session.authUser
  let categoryData = {}
  let categoryItemData = {}
  let category = query.category
  if(category){
    let res = await fetch(url1,
    {
        method: 'POST',
        credentials: 'include',
    })
    categoryData = await res.json();
    let categoryItemsRes =  await fetch(url2, 
        {
            method: 'POST',
            credentials: 'include',
        })
    categoryItemData = await categoryItemsRes.json();
  }

  return { query, authUser, categoryData, categoryItemData }
}

2 个答案:

答案 0 :(得分:2)

在这一点上这可能是多余的,但是我也碰到了这一点,发现文档对此进行了解释here

在预渲染期间,路由器的查询对象将为空,因为在此阶段我们没有要提供的查询信息。水化后,Next.js将触发对您的应用程序的更新,以在查询对象中提供路由参数。

您可以尝试以下方法:

export async function getServerSideProps(ctx) {
  const { id } = ctx.query;
  return {
    props: {
      id,
    },
  };
}

通过这种方式,它在呈现服务器端时获取查询参数 ,因此它们立即可用。

答案 1 :(得分:0)

对于使用 express 自定义服务器的其他人,要修复 undefined 参数,我们必须在 server.js 处设置动态路由,如下所示:

# server.js
...

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

  server.get('/product/:category', (req, res) => {
    const { category } = req.params;
    return app.render(req, res, `/product/${category}`, req.query)
  })
  
  ...
}

然后,正如 Valentijn 回答的那样,我们可以获得类别参数。

# pages/product/[category].js
....

export async function getServerSideProps(ctx) {
  const {category} = ctx.params;
  return {
    props: {
      category
    },
  };
};

...

关键是动态路径/product/${category}。不要使用/product/:category