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

如何在Sequelize(PostgreSQL)中跨表取数并用于另一表操作

解决方案

首先你的代码存在两个核心问题:

  • 变量email未定义,找不到查询用户的有效依据
  • 解构错误:User.findOne返回的是包含email字段的用户对象,并非author字段

结合你已使用authMiddleware的前提,这类验证中间件通常会将当前登录用户的信息(比如id、email)挂载到req.user对象中,无需重复查询数据库。以下是两种可行的修正方案:

方案一:直接从req.user获取邮箱(推荐)

如果你的authMiddleware已经将用户邮箱存入req.user.email,可以直接使用该值:

async createPost(req,res) {
    try {
        const { title, content } = req.body;
        
        if(!title || !content) {
            return res.status(400).json({message: '标题或内容不能为空'});
        }
        
        // 直接从req.user取邮箱作为author字段值
        const post = await Post.create({ 
            author: req.user.email, 
            title, 
            content 
        });
        
        return res.json({post});
    } catch (e) {
        console.log(e.message);
        return res.status(500).json({message: '创建帖子失败'});
    }
}

方案二:通过用户ID查询数据库获取邮箱

如果authMiddleware仅挂载了用户ID(req.user.id),则通过ID查询用户表获取邮箱:

async createPost(req,res) {
    try {
        const { title, content } = req.body;
        
        if(!title || !content) {
            return res.status(400).json({message: '标题或内容不能为空'});
        }
        
        // 通过用户ID查询用户信息
        const user = await User.findOne({ where: { id: req.user.id } });
        if(!user) {
            return res.status(404).json({message: '用户不存在'});
        }
        
        const post = await Post.create({ 
            author: user.email, 
            title, 
            content 
        });
        
        return res.json({post});
    } catch (e) {
        console.log(e.message);
        return res.status(500).json({message: '创建帖子失败'});
    }
}

额外说明

  • 务必确认authMiddleware正确将用户信息存入req.user,比如JWT验证时,解析token后要把用户数据挂载到req.user上
  • 原代码中注释的参数校验逻辑建议保留,避免空数据入库
  • 错误处理中建议返回对应的HTTP状态码,方便前端识别处理

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 06:03:19