用于记录编码过程中遇到的困难或有趣的问题,包括前端/后端(Node/Db),会持续更新...后端Noderedis集群模式Pipline错误(2019.3.14)问题描述:在redis集群模式下,使用管道操作不同的key值会报错管道中所有的key都应该属于同一个slot问题解决:要理解redis集群的槽位:集群中的每个节点都有固定数量的槽位。所有存储的key值经过hash计算后会存储在不同的槽中,即不同的节点。因此,如果在流水线的过程中键值索引不在同一个槽中,就会报上面的错误。解决方法:如果不是就不要用pipline去操作同类型的key值。如果是同一类型,则将相同的部分用'{}'包裹起来,因为这部分是用于hash计算的。例如:redis.pipline().set('cache1',1).set('cache2',2).exec()改为redis.pipline().set('{cache}1',1)。set('{cache}2',2').exec()原文档机票eggjs修改文件重载问题(2017.8.30)问题描述:在开发环境启动项目,修改文件后eggjs自动重载,但是修改后重新加载,所有请求都处于挂起状态,所有日志都处于正常状态。问题探索:在eggjs的issue中发现了类似的问题。基本上修改文件后是不能重新加载的。需要crtl+c手动重启。解决办法基本就是重装依赖,但是吃了饭还是不行。使用脚手架新生成的项目还是有这个问题,同事的电脑上没有出现,所以去官方issue提了个问题。既然是个别现象,老板也没有解决。目前可以确定是电脑问题,只有我有这个问题。既然没有现成的解决方案,那就只能寄希望于源码了。解决问题:在eggjs文档中可以找到cluster-reload模块负责重新加载。代码非常简单,只有80+行,而且很容易理解。在reset()中打印出newWorker(重启后的新工作进程)和firstWorker(旧工作进程)的状态,可以发现一切都在按正常情况进行,但是在新工作进程结束时k进程莫名其妙死了,并没有触发任何重启。经过一番尝试,有一个成功的解决方案:firsterWorker.kill(KILL_SINGNAL)beforecluster.fork()(forknewworkprocess)(Killtheoldprocess)。后记:虽然没有找到问题的真正原因(可以继续深挖),但是解决了reload这个痛苦的问题,但是这种方法需要修改node_modules中的源码,很不方便,可以只在开发过程中使用,生产环境要有优雅的rollout流程。SequelizemigratechangeColumn问题描述Modifyfieldtypeerrorcannotbecasttotypeinteger数据库:Postgresql错误原因:将字段的数据类型从STRING改为INTEGER(完全按照文档queryInterface.changeColumn(tableName:String,attributeName:String,dataTypeOrOptions:Object,options:Object)),但是Sequelize转换的sql语句有问题,不适用于Postgresql,需要修改字段类型的类型来解决问题//代码为修改字段类型应该是queryInterface.changeColumn('table','column',{type:'INTEGERUSINGCAST("column"asINTEGER)',allowNull:false,})issue详情前端Vuejselement-uipopover错误(2018.02.09)错误内容:[Vuewarn]:Errorindirectivepopoverbindhook:"TypeError:Cannotreadproperty'$refs'ofundefined"code
