+-
Mongoose在Schema中使用get修饰符格式化日期时间无效的一种情况
首页 专栏 mongodb 文章详情
0

Mongoose在Schema中使用get修饰符格式化日期时间无效的一种情况

xdlStrive 发布于 4 月 20 日

Mongodb数据库存储时间的格式是ISO格式的,与北京时间有8个小时的时区差,所以在实际使用过程中往往需要对数据库中取出的时间进行格式化。
moment.js是一个很好用的日期处理方面的类库,@官网
具体的使用方式如下:

const UserSchema = new mongoose.Schema({ username: { type: String, required: true, unique: true }, password: { type: String, required: true }, email: String, create_time: { type: Date, default: Date.now, get: v => moment(v).format('YYYY-MM-DD HH:mm:ss') // 这里大写的HH是24小时制,小写的hh是12小时制 } });

但在配合mongoose使用时遇到了一个坑,虽然使用方法是正确的,但前台从后台拿到的JSON里的日期却还是数据库中未经格式化的原始数据,也就是说写在schema中的日期格式化代码好像并没有生效。

一开始一直以为是moment或者Schema哪里写的有问题,但试着在接口返回数据之前输出了一下,结果输出的日期却是格式化好了的,这就很奇怪了。
后来又搜索了半天原因之后才得知,是Schema差了一个属性,这里需要这样设置

UserSchema.set('toJSON', { getters: true });

如果不这样设置的话,返回的JSON是不会触发Schema中的get修饰符的,这也就导致了后台返回的结果里依旧是格式化之前的日期。

mongodb mongoose moment.js get修饰符
阅读 64 更新于 4 月 20 日
举报
收藏
分享
本作品系原创, 采用《署名-非商业性使用-禁止演绎 4.0 国际》许可协议
avatar
xdlStrive
1 声望
0 粉丝
关注作者
0 条评论
得票数 最新
提交评论
avatar
xdlStrive
1 声望
0 粉丝
关注作者
宣传栏
目录

Mongodb数据库存储时间的格式是ISO格式的,与北京时间有8个小时的时区差,所以在实际使用过程中往往需要对数据库中取出的时间进行格式化。
moment.js是一个很好用的日期处理方面的类库,@官网
具体的使用方式如下:

const UserSchema = new mongoose.Schema({ username: { type: String, required: true, unique: true }, password: { type: String, required: true }, email: String, create_time: { type: Date, default: Date.now, get: v => moment(v).format('YYYY-MM-DD HH:mm:ss') // 这里大写的HH是24小时制,小写的hh是12小时制 } });

但在配合mongoose使用时遇到了一个坑,虽然使用方法是正确的,但前台从后台拿到的JSON里的日期却还是数据库中未经格式化的原始数据,也就是说写在schema中的日期格式化代码好像并没有生效。

一开始一直以为是moment或者Schema哪里写的有问题,但试着在接口返回数据之前输出了一下,结果输出的日期却是格式化好了的,这就很奇怪了。
后来又搜索了半天原因之后才得知,是Schema差了一个属性,这里需要这样设置

UserSchema.set('toJSON', { getters: true });

如果不这样设置的话,返回的JSON是不会触发Schema中的get修饰符的,这也就导致了后台返回的结果里依旧是格式化之前的日期。