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

如何在Next.js的API路由中通过next-auth获取当前用户ID?

在Next.js API路由中获取当前用户ID并存入MongoDB

核心问题

API路由运行在服务器端,无法直接使用客户端的useSession Hook,必须借助服务器端的会话获取方法(比如NextAuth的getServerSession)来安全获取用户身份信息。

解决方案步骤

  1. 确保已完成NextAuth的基础配置(若未配置,先在项目中搭建NextAuth认证体系)
  2. 在API路由文件中导入getServerSession和你的Auth配置文件(通常位于pages/api/auth/[...nextauth].js)
  3. 在处理POST请求时,先获取会话信息并验证用户身份,再提取用户ID存入MongoDB文档

修改后的完整代码

import { MongoClient } from "mongodb";
import { getServerSession } from "next-auth/next";
import { authOptions } from "../auth/[...nextauth]"; // 路径根据你的项目结构调整

async function handler(req, res) {
  if (req.method === "POST") {
    // 1. 获取服务器端会话,验证用户身份
    const session = await getServerSession(req, res, authOptions);
    if (!session || !session.user?.id) {
      res.status(401).json({ message: "未授权,请先登录" });
      return;
    }

    const { name, bio, size, location, logo, website, industry } = req.body;

    // 后端输入验证
    if (!name || name.trim() === "") {
      res.status(422).json({ message: "无效输入,公司名称不能为空" });
      return;
    }

    // 2. 将用户ID加入待存储的公司对象
    const newCompany = {
      name,
      size,
      bio,
      location,
      logo,
      website,
      industry,
      userId: session.user.id, // 关联创建者用户ID
      createdAt: new Date() // 可选:添加记录创建时间
    };

    let client;

    try {
      client = await MongoClient.connect(process.env.MONGODB_URI);
    } catch (error) {
      res.status(500).json({ message: "无法连接数据库" });
      return;
    }

    const db = client.db("main");

    try {
      const result = await db.collection("companies").insertOne(newCompany);
      newCompany._id = result.insertedId; // 可选:将MongoDB生成的ID附加到对象
    } catch (error) {
      client.close();
      res.status(500).json({ message: "存储公司信息失败" });
      return;
    }

    client.close();

    res.status(201).json({ 
      message: "成功存储公司信息",
      company: newCompany // 可选:返回创建后的完整公司数据
    });
  } else {
    // 处理非POST请求
    res.status(405).json({ message: "仅支持POST请求" });
  }
}

export default handler;

关键说明

  • 服务器端会话安全:getServerSession是NextAuth提供的服务器端方法,能在服务端安全验证用户身份,避免客户端敏感数据暴露
  • 身份校验:必须先检查会话有效性,拦截未授权用户的请求
  • 用户ID关联:通过session.user.id获取当前登录用户ID,直接加入待存储的文档对象,实现数据与用户的关联
  • 完善错误处理:补充了非POST请求的响应,以及登录状态、数据库连接等场景的错误反馈

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 16:40:41