在不覆盖 'createdAt' 和 'updatedAt' 的情况下在 sails 中创建 UTC 时间戳
Creating UTC timestamps in sails without overriding 'createdAt' and 'updatedAt'
我想用 UTC 时间戳 (createTimeUTC) 更新我的一个模型中的字段。但我不想 overwrite/override 'createdAt' 字段。我尝试导入 moment 并使用 moment.utc().format() 来更新创建时的记录。但即使 moment 似乎给出了正确的 UTC 格式时间戳,数据库中的记录仍然被创建为 "null".
这是我的模型:
module.exports = {
attributes: {
....
createTimeUTC: {
type: 'datetime',
},
},
afterCreate:function(values,next) {
var moment=require('moment');
values.createTimeUTC= moment.utc().format();
console.log("after create: "+ values.createTimeUTC);
next();
};
这是我在控制器中的创建方法:
myControllerMethod: function(req, res) {
var moment=require('moment');
var params = req.params.all();
params.owner = req.session.user.id;
Note.create({owner: params.owner, title: params.title, content: params.content, createTimeUTC: params.createTimeUTC }).exec(function(err, note) {
if(err) {
var msg = 'Unexpected error has occured';
sails.log.error(err);
res.status(400);
return res.send(msg);
}
else {
console.log("CREATED:"+note.createTimeUTC);
res.redirect("/admin/notes/scratchpad");
}
});
},
有人可以指出我哪里错了吗?
此外,有没有一种方法可以在前端将 "createdAt" 时间转换为 UTC,而不必在后端创建新字段?
仅更改 afterCreate
处理程序中的值不会完成更改。 values
对象不是模型实例,而是一个简单的对象。要保存新创建的字段,您需要在 afterCreate
:
中再次调用数据库
afterCreate: function(values, next) {
var moment = require('moment');
values.createTimeUTC= moment.utc().format();
Note.update({ id: values.id }, values, next);
};
就在前端更改时间格式而言,如果它支持与日期相关的过滤器,您可以在您的视图中执行此操作。如果服务器端渲染不可能,唯一的选择是在页面加载后 show/update date/time,使用纯 JS。
如果您希望每次访问模型时都显示格式化的日期,那么在模型的 toJSON
函数中进行格式化可能有意义:
toJSON: function(){
var moment=require('moment');
var obj = {};
obj.field = this.field;//for all other fields
obj.createdAt = moment.utc(this.createdAt).format();
return obj;
}
将其放入模型的 attributes
部分。
注意:如果您希望在保存到数据库时保留 date/time 格式,请使用类型 string
而不是 datetime
模型,否则它仍会反映配置语言环境的 date/time 字符串。
进一步研究,我发现 createdAt
和 updatedAt
时间已经通过 sails 在 MySQL 中存储为 UTC(在控制台上打印为 UTC,尽管在视图中显示为 PDT ).所以我只需要在我的视图中使用 moment.utc(note.createdAt).format()
来显示 UTC 时间。至于带有 MySQL 数据库的 sails 的行为,this 讨论提供了一些理解。
我想用 UTC 时间戳 (createTimeUTC) 更新我的一个模型中的字段。但我不想 overwrite/override 'createdAt' 字段。我尝试导入 moment 并使用 moment.utc().format() 来更新创建时的记录。但即使 moment 似乎给出了正确的 UTC 格式时间戳,数据库中的记录仍然被创建为 "null".
这是我的模型:
module.exports = {
attributes: {
....
createTimeUTC: {
type: 'datetime',
},
},
afterCreate:function(values,next) {
var moment=require('moment');
values.createTimeUTC= moment.utc().format();
console.log("after create: "+ values.createTimeUTC);
next();
};
这是我在控制器中的创建方法:
myControllerMethod: function(req, res) {
var moment=require('moment');
var params = req.params.all();
params.owner = req.session.user.id;
Note.create({owner: params.owner, title: params.title, content: params.content, createTimeUTC: params.createTimeUTC }).exec(function(err, note) {
if(err) {
var msg = 'Unexpected error has occured';
sails.log.error(err);
res.status(400);
return res.send(msg);
}
else {
console.log("CREATED:"+note.createTimeUTC);
res.redirect("/admin/notes/scratchpad");
}
});
},
有人可以指出我哪里错了吗?
此外,有没有一种方法可以在前端将 "createdAt" 时间转换为 UTC,而不必在后端创建新字段?
仅更改 afterCreate
处理程序中的值不会完成更改。 values
对象不是模型实例,而是一个简单的对象。要保存新创建的字段,您需要在 afterCreate
:
afterCreate: function(values, next) {
var moment = require('moment');
values.createTimeUTC= moment.utc().format();
Note.update({ id: values.id }, values, next);
};
就在前端更改时间格式而言,如果它支持与日期相关的过滤器,您可以在您的视图中执行此操作。如果服务器端渲染不可能,唯一的选择是在页面加载后 show/update date/time,使用纯 JS。
如果您希望每次访问模型时都显示格式化的日期,那么在模型的 toJSON
函数中进行格式化可能有意义:
toJSON: function(){
var moment=require('moment');
var obj = {};
obj.field = this.field;//for all other fields
obj.createdAt = moment.utc(this.createdAt).format();
return obj;
}
将其放入模型的 attributes
部分。
注意:如果您希望在保存到数据库时保留 date/time 格式,请使用类型 string
而不是 datetime
模型,否则它仍会反映配置语言环境的 date/time 字符串。
进一步研究,我发现 createdAt
和 updatedAt
时间已经通过 sails 在 MySQL 中存储为 UTC(在控制台上打印为 UTC,尽管在视图中显示为 PDT ).所以我只需要在我的视图中使用 moment.utc(note.createdAt).format()
来显示 UTC 时间。至于带有 MySQL 数据库的 sails 的行为,this 讨论提供了一些理解。