如何在Sequelize中返回插入数据库后新创建的实例
问题修复方案
1. 核心问题原因
- 你定义了async异步函数
newUser但没有实际调用,打印的是函数对象本身而非执行结果 - 异步操作未完成就提前返回了响应,没有等待
User.create执行结束 newUser内部的return data写在console.log前面,导致日志代码永远不会执行- User模型定义缺少字段类型声明,本身会导致插入报错
- 参数校验分支没有加return,校验失败后代码会继续向下执行
2. 修改后的create方法代码
// 给整个路由处理函数加async修饰 exports.create = async (req, res) => { try { let user = { "username" : req.body.username, "email" : req.body.email, "pseudo" : req.body.pseudo, "password" : bcrypt.hashSync(req.body.password,10), "created_at" : sequelize.fn('NOW') }; if (!user.username || !user.email) { // 加return阻止后续代码执行,参数错误建议用400状态码而非201 return res.status(400).send("username or email required!") } // 直接await User.create拿结果,不需要额外嵌套一层async函数 const newUser = await User.create(user); // 打印返回的实例 console.log("创建成功的用户实例:", newUser); // 把实例返回给前端 return res.status(200).send({ "message" : "ok", "data": newUser }); } catch (e) { // 统一捕获错误 console.error("创建用户失败:", e); return res.status(500).send({ "message": "创建失败", "error": e.message }) } }
3. 修改后的User模型代码
需要给每个字段指定对应类型,可根据实际业务调整字段属性:
const { Sequelize, DataTypes } = require('sequelize'); const sequelize = require('../services/database_connection'); const validate = require('validator'); const User = sequelize.define('user',{ id: { type: DataTypes.INTEGER, primaryKey: true, autoIncrement: true }, username: { type: DataTypes.STRING, allowNull: false }, email: { type: DataTypes.STRING, allowNull: false, validate: { isEmail: true } }, pseudo: DataTypes.STRING, password: { type: DataTypes.STRING, allowNull: false }, created_at: { type: DataTypes.DATE, allowNull: false } }, { timestamps : false, freezeTableName : true, }); module.exports = User;
内容的提问来源于stack exchange,提问作者Majd
相关产品推荐
相关产品推荐

