SailsJS自动更新createdAt/updatedAt配置问题求助
嘿,我帮你梳理下问题所在,其实核心是字段类型不匹配以及模型配置的优先级问题,咱们一步步来修复:
1. 修正字段类型匹配问题
你的MySQL表中createdAt和updatedAt是DATETIME类型,但在模型和全局配置里都把它们设成了number类型——这就导致Sails没法正确映射和自动更新这些字段。Sails的autoCreatedAt和autoUpdatedAt默认会生成数字时间戳,但如果你的数据库字段是DATETIME,得把模型里的类型改成datetime(Sails v1+直接支持这个类型)。
修改你的Users.js模型:
module.exports = { tableName: 'users', primaryKey: 'id', attributes: { id: { type:'number', unique:true, autoIncrement:true }, name: { type:'string' }, email: { type:'string' }, password: { type:'string' }, profilePicture: { type:'longtext' }, location: { type:'string' }, createdAt: { type: 'datetime', autoCreatedAt: true }, // 匹配数据库类型+开启自动填充 updatedAt:{ type: 'datetime', autoUpdatedAt: true } // 同样配置 } };
2. 调整全局与模型的配置优先级
Sails里模型级别的配置会覆盖全局config/model.js的配置。你在全局里加了autoCreatedAt: true和autoUpdatedAt: true,但如果模型里的字段类型不匹配,或者没明确开启这些属性,就不会生效。
你有两种选择:
方案一:依赖全局配置,确保全局和模型类型一致
修改config/model.js:migrate: 'safe', attributes: { createdAt: { type: 'datetime', autoCreatedAt: true }, updatedAt: { type: 'datetime', autoUpdatedAt: true }, id: { type: 'number', autoIncrement: true }, },然后模型
Users.js里可以删掉createdAt和updatedAt的定义,让全局配置直接生效;或者保留定义但和全局保持一致。方案二:单独在模型里配置,不依赖全局
就是上面修改模型的代码,直接在模型字段里加上autoCreatedAt和autoUpdatedAt,这样更灵活,适合不同模型有不同配置的场景。
3. 关于已存在的数据库表
完全不用纠结这个!Sails的自动更新字段功能根本不要求表是Sails创建的——只要字段存在、类型匹配、配置正确,就能正常生效。你之前的问题和表的创建来源无关,就是类型和配置的小问题。
4. 验证修复
改完配置后重启Sails服务,尝试创建或更新一个用户条目,然后去MySQL里看看createdAt和updatedAt是不是自动填充/更新了。如果还是有问题,可以检查:
- 数据库用户有没有该表的读写权限
- 确认
migrate: 'safe'不会影响这个功能——它只是禁止Sails自动修改表结构,完全不影响业务逻辑里的自动字段填充
内容的提问来源于stack exchange,提问作者MarkusAfricanus

