sequelize v5版本使用create或者findOrCreate添加数据时,传过去的值都是undefined
发布于 6 年前 作者 yss1993 5377 次浏览 来自 问答

模型定义

const Sequelize = require('sequelize');
const BaseModel = require('./BaseModel');
const sequelize = require('../lib/HealthCheck').getCheckInstance().getMysqlConnection(); //获取最下面定义的sequelize连接
class UserModel extends BaseModel {
    constructor() {
        super();
    }
    async addNewUser(params) {//params是传过来的参数,主要是要添加的字段值,类型是Object
        let addRuesult = await UserModel.findOrCreate({
            where: {username: params.username},
            defaults: {password: params.password, nickname: params.nickname, region: params.region, status: 11}
        });

        return addRuesult;
    }
}

//用户表模型定义
UserModel.init({
    id: {type: Sequelize.UUID, defaultValue: Sequelize.UUIDV1, allowNull: false, primaryKey: true},
    username: {type: Sequelize.STRING, allowNull: false},
    password: {type: Sequelize.STRING, allowNull: false},
    nickname: Sequelize.STRING,
    region: Sequelize.STRING,
    status: {type: Sequelize.INTEGER(2), allowNull: false},
    created_time: {type: Sequelize.DATE, allowNull: false},
    last_login_time: Sequelize.DATE
}, {
    sequelize,
    modelName: 'user',
    timestamps: true,
    createdAt: 'created_time',
    updatedAt: 'last_login_time',
    deletedAt: false
});

module.exports = UserModel;

BaseModel定义

const Sequelize = require('sequelize');
const Model = Sequelize.Model;

class BaseModel extends Model{
    constructor() {
        super();
    }
}

module.exports = BaseModel;

数据库连接定义

 let sequelize = new Sequelize({
 	host: '127.0.0.1',
        port: 3306,
        username: 'root',
        password: '123456',
        database: 'service',
        dialect: 'mysql',
        define: {
            freezeTableName: true
        }
 });

问题 模型定义由于有做字段值非空验证,结果sequelize会报验证非空错误,传过来的参数都是能正确获取到的,就是调用create或者findOrCreate方法时无法获取到字段值;我有试过在调用sequelize的方法时,直接将字段值写死,还是会报一样的错;大神们帮我看看到底是我定义错了,还是哪个地方出了问题?谢谢!

9 回复

请各路大神帮我看看,万分感谢!!!

这是我安装的依赖

 	"mysql2": "^1.6.5",
 	 "sequelize": "^5.5.0"

username, created_time 没有传

@zbinlin init那边定义了create_At:create_time 不传也没关系的吧. 还有这个问题我觉得最好就把数据库里面的配置也发出来,不然你这里好像也没有force,根据sequelize直接强制修改数据库,可能数据库配置跟代码写的数据类型这种东西不一样.

@zbinlin 兄弟 根据sequelize文档关于findOrCreate方法的介绍,username作为查询条件,当没有查询到对应的记录时,会将username自动添加到字段上,所以不用传值;具体看链接 sequelize关于findOrCreate方法的使用 created_time我在模型定义时,定义了 createdAt: 'created_time',,而createdAt会在创建记录时自动添加;

@cheerApril 兄弟 这是数据库配置

 mysql: { //mysql的ORM框架sequelize配置
        host: '127.0.0.1',
        port: 3306,
        username: 'root',
        password: '123456',
        database: 'demo',
        dialect: 'mysql',
        define: {
            freezeTableName: true
        }
    }

@yss1993 我想表达的应该就是的数据库对应表跟你这个文件里面的字段是否一致.

@yss1993 #7

看了下源码,发现并不是不能用什么构造方法,而是你用得不对,

https://github.com/sequelize/sequelize/blob/379b56c873d1c68bee1f48a828b14662de070834/lib/model.js#L2152

https://github.com/sequelize/sequelize/blob/379b56c873d1c68bee1f48a828b14662de070834/lib/model.js#L84

这里在创建实例时,需要将对应的参数传进来的,而在你的代码里,调用 super() 时,并没有传对应的参数进来,导致被继承的 Model 无法获取 values

你可以将

    constructor() {
        super();
    }

改成

    constructor(...args) {
        super(...args);
    }

或者如果不需要在 contructor 处理一些初始化操作时,把 constructor 省略掉。

@zbinlin 看源码真是一个好习惯 我也要试着去看看源码了 努力提升自己的水平 谢谢!

回到顶部