getServerSideProps 不使用导入更新数据

Posted

技术标签:

【中文标题】getServerSideProps 不使用导入更新数据【英文标题】:getServerSideProps is not updating data with import 【发布时间】:2021-08-20 18:40:46 【问题描述】:

我遇到了 NextJS 中的 getServerSideProps 没有在页面加载时更新值的问题。从导入的 JSON 文件的数据中调用时,它似乎与使用 getStaticProps 具有相同的效果。

这是适用的代码:

/update/[...id].js

import  hasPermission, getPermissions  from '../../lib/permissions'
...
//in the page function I use the ternary to check permission of the user
 (hasPermission(session.user.email, `$params.id[0]-edit`, permissions)) ? <HasPerm /> : <NoPerm /> 
...
export async function getServerSideProps(context) 
  const params = context.query
  const permissions = getPermissions()
  return 
    props:  params, permissions 
  

/lib/permissions.js

import permissions from '../db/users.json'

export function hasPermission(username, group, perm = false) 
  if (!perm)
    perm = permissions

  if (username in perm && perm[username].groups.includes(group)) 
    return true
  
  if (perm.all.groups.includes(group)) 
    return true
  
  return false


export function getPermissions() 
  return permissions

对于一开始就可以理解的 s-s-r 页面,我将权限传递给 getStaticProps 中的页面,并将这些值传递到这些页面中的 hasPermission() 函数中,以便在权限更改时重新验证它们。然而getServerSideProps 中没有重新验证选项,因此根本不会重新验证数据。我之前使用过getInitialProps,但几乎每个人都不鼓励这样做,因为它会禁用 ASO。

如何使用getServerSideProps 以至少重新验证我导入的 json?

【问题讨论】:

【参考方案1】:

由于其他原因,我最终没有使用 json 导入,而是使用了 fs,但通过在 getServerSideProps 中使用动态导入解决了这个问题:

export async function getServerSideProps(context) 
  const permissions = await import('../db/users.json')

也不要犯同样的错误,将整个权限数据库传递给每个用户,就像在getStaticProps 中使用getPermissions 之类的函数将数据传递给页面中的hasPermission 函数一样。相反,如果用户有权限,则仅使用 getServerSideProps 提供数据。换句话说,确保您从服务器端保留数据。然后,如果需要,您还可以将个人的权限传递给页面,例如显示一条消息说您没有权限。

【讨论】:

以上是关于getServerSideProps 不使用导入更新数据的主要内容,如果未能解决你的问题,请参考以下文章

将单个 getServerSideProps 方法导入 Nextjs 中的多个页面

getServerSideProps 无法正常运行

getServerSideProps() 未使用组件运行

getServerSideProps 在生产中不渲染动态页面,并显示 404 错误

如何在 nextJS getserversideprops 中使用 firebase

使用 Next Js getServerSideProps 进行 Apollo 查询?