共计 1884 个字符,预计需要花费 5 分钟才能阅读完成。
一、已存在数据的表中添加一个字段 @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
三、修改文件夹权限
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 的区别
框架是以 Cluster 方式启动的,而 socket.io 协议实现需要 sticky 特性支持,否则在多进程模式下无法正常工作。由于 socket.io 的设计,在多进程中服务器必须在 sticky 模式下工作,故需要给 startCluster 传递 sticky 参数