在帆中创建UTC时间戳而不会覆盖' createdAt'和' updatedAt'

时间:2015-07-22 00:11:41

标签: javascript mysql node.js sails.js momentjs

我想使用UTC时间戳(createTimeUTC)更新我的某个模型中的字段。但我不想覆盖/覆盖“已创建的”。领域。我尝试导入时刻并使用moment.utc()。format()更新创建时的记录。但即使时刻似乎给出了正确的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();
    };

这是我在控制器中的create方法:

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时间比在后端创建新字段的时间长?

2 个答案:

答案 0 :(得分:2)

只需更改afterCreate处理程序中的值即可完成更改。 values对象不是模型实例,而是简单对象。要保存新创建的字段,您需要在afterCreate中进行另一个数据库调用:

afterCreate: function(values, next) {
    var moment = require('moment');
    values.createTimeUTC= moment.utc().format();
    Note.update({ id: values.id }, values, next);
};

就更改前端的时间格式而言,如果它支持与日期相关的过滤器,则可以在视图中执行此操作。如果无法进行服务器端渲染,唯一的选择是使用普通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部分内。

注意:如果您希望在保存到数据库时保留日期/时间格式,请在模型中使用string而不是datetime,否则它仍然会反映已配置的区域设置的日期/时间字符串。

答案 1 :(得分:0)

进一步研究这个问题,我发现createdAtupdatedAt次已经通过sails在UTC中存储为UTC(在控制台上以UTC格式打印,尽管在视图中显示为PDT)。所以我只需要在视图中使用moment.utc(note.createdAt).format()来显示UTC时间。就涉及MySQL数据库的帆的行为而言,this讨论给出了一些理解。