You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NextJS前端获取数据库数据:getServerSideProps用法是否合规?

Next.js 数据获取方式答疑

1. 从数据库获取数据的正确路径

Next.js 不存在绝对唯一的“正确方式”,核心是根据业务场景选择:

  • 服务端直接调用数据库服务(你当前的做法):完全适配仪表盘这类无需SEO、依赖实时数据的页面,属于官方认可的高效方案。跳过中间API层,减少网络请求损耗,性能更优。
  • 通过API路由获取数据:适合需要复用数据逻辑(比如前端组件、客户端动态请求都要调用)的场景。但如果仅服务端渲染时拉取数据,直接调用服务层是更优选择。
  • 静态生成(SSG/ISR):适用于内容更新频率低、需要SEO优化的页面,比如博客、商品详情页。

2. 你当前代码的合规性

你在getServerSideProps里直接调用getUsers服务的方式完全符合Next.js推荐规范,甚至比“先调API再查数据库”的冗余流程更合理。不过可以做两处优化:

  • 补全服务端认证逻辑:当前仅在客户端用useSession判断登录状态,但getServerSideProps未做校验,可能导致未登录用户触发数据库请求。建议在服务端提前拦截:
    export async function getServerSideProps(context) {
      const session = await getSession(context);
      if (!session) {
        return {
          redirect: {
            destination: '/login',
            permanent: false,
          },
        };
      }
      const users = await getUsers();
      return {
        props: {
          users: JSON.parse(JSON.stringify(users)),
        },
      };
    }
    
  • 优化数据序列化:JSON.parse(JSON.stringify(users))可以简化,比如如果用Mongoose查询,在getUsers里加上.lean(),直接返回普通JS对象,无需额外序列化操作。

3. 关于之前认证问题的补充

你之前用RESTful API遇到认证问题,大概率是客户端调用API时需要手动携带认证凭证(Cookie/Token),而服务端渲染的getServerSideProps可以直接访问请求上下文里的会话信息,认证逻辑更简洁。同时在服务层调用数据库时,还能直接基于服务端会话做权限校验(比如只返回当前用户有权查看的用户列表)。

内容的提问来源于stack exchange,提问作者Maramal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 10:48:30