likes
comments
collection

后端工作笔记

作者站长头像
站长
· 阅读数 1

一、已存在数据的表中添加一个字段@Index设置索引的需要注意的

场景复现:
1、在一张有数据的表中需要添加字段2、恰巧这个字段需要设置索引,且是唯一索引3、这时typeOrm自动更新表的时候会报错,因为这张表中已经存在的数据的此项新增字段为空,且你又设置为唯一索引,就会报错
解决办法:
1、 先设置@Index 非唯一索引2、 然后往表中已存在的数据此字段处添加数据(唯一字符串之类的数据)3、 再设置此表为@Index({ unique: true })4、 注意:在本地数据库和远端数据库同步时也要注意这个问题,只能先同步非唯一索引的设置,同步完表结构,然后添加完唯一数据,再同步设置唯一索引

二、关于mysql中时区的问题

在midway官网中对typeorm的简介中有讲到不建议设置timezone: '+08:00'
原因:
  • 在mysql的datetime字段中你存入的时间是什么,提取出来的时间就是什么。当你设置mysql的时区后,你存入的是东八区的时间,那么提取出来的时间也是东八区的时间。有理可得对MySQL修改时区会对datetime类型的旧数据有影响。
  • 为什么要存储UTC时间??因为——国际化!!想象一下,有一天,我们的程序运行在世界各地,如果程序中总是拿到当前时间就存储,当你访问伦敦的节点,或者加利福尼亚的节点,或者新加坡的节点,如何协调统一,岂不是乱了套了??而,如果我们都用UTC时间存储,当世界各个节点的时间都在一个时区进行显示时,所有节点的UTC时间都只需要加减同一个数字就可以了!
指令补充:

1、 linux指令:

  • date +"%Z %z"    //查看容器中当前操作系统的时区
  • date -R //查看容器中当前操作系统的具体时间

2、mysql指令:

  • set global time_zone = '+8:00';FLUSH PRIVILEGES; //mysql中设置时区,等同于orm框架中config中设置

建议的解决方案:

UTC时间前端转化成东八区时间:

formatTime(utc_datetime) {
    // 转为正常的时间格式 年-月-日 时:分:秒
    // 如果你的时间已经是正常的时间格式,后端已经转化好了,那么跳过这行代码
    var new_datetime = utc_datetime.split("T")[0] + " " + utc_datetime.split("T")[1].split(".")[0]
    // 处理成为时间戳
    timestamp = new Date(Date.parse(new_datetime));
    timestamp = timestamp.getTime();
    timestamp = timestamp / 1000;
    // 增加8个小时,北京时间比utc时间多八个时区
    var timestamp = timestamp + 8 * 60 * 60;
    // 时间戳转为时间
    var n = parseInt(timestamp) * 1000;
    var D = new Date(n);
    var year = D.getFullYear(); //四位数年份
    var month = D.getMonth() + 1; //月份(0-11),0为一月份
    month = month < 10 ? ('0' + month) : month;
    var day = D.getDate(); //月的某一天(1-31)
    day = day < 10 ? ('0' + day) : day;
    var hours = D.getHours(); //小时(0-23)
    hours = hours < 10 ? ('0' + hours) : hours;
    var minutes = D.getMinutes(); //分钟(0-59)
    minutes = minutes < 10 ? ('0' + minutes) : minutes;
    var seconds = D.getSeconds(); //秒(0-59)
    seconds = seconds < 10 ? ('0' + seconds) : seconds;
    var beijing_datetime = year + '-' + month + '-' + day + ' ' + hours + ':' + minutes+ ':' + seconds 
    return beijing_datetime; // 2020-10-11 15:32:06
}

三、修改文件夹权限

1、 chown -R root:root ./redis 修改当前路径redis文件夹中所有的文件的所属权,所属用户root:所属用户组root2、 groups xxx用户查看xxx用户的权限组

四、泛域名解析

利用通配符*(星号)来做次级域名以实现所有的次级域名均指向同一IP地址(此IP须为独立IP)。在域名前添加任何子域名,均可访问到所指向的WEB地址。也就是客户的域名a.com之下所设的*.a.com全部解析到同一个IP地址上去。

比如客户设b.a.com就会自已自动解析到与a.com同一个IP地址上去。例如我的域名是abc.cn:比如做一个*.abc.cn的次级域名A记录指向222.222.222.222,那么生效后当访问者无论是输入“123.abc.cn”还是“123.123.abc.cn”甚至可以是 “ !@#.$%$.6543.ww.a.abc.cn ”这样的任意字符,均可以指向到222.222.222.222这个IP地址。

五、egg-socket.io 中的sticky模式和nginx配置ip_hash的区别

issue

框架是以 Cluster 方式启动的,而 socket.io 协议实现需要 sticky 特性支持,否则在多进程模式下无法正常工作。由于 socket.io 的设计,在多进程中服务器必须在 sticky 模式下工作,故需要给 startCluster 传递 sticky 参数