如何在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
相关产品推荐
相关产品推荐

