用于记录coding过程中遇到的比较难解决或者有意思的问题,包括前端/后端(Node/Db),会持续更新…
后端
Node
redis集群模式下pipline报错(2019.3.14)
- 问题描述: 在redis集群模式下,使用pipeline操作不同key值会报错
All keys in the pipeline should belong to the same slot
问题解决:
- 去了解一下redis集群的slot: 集群中每个节点有固定slot的数量,所有存储的key值经过hash计算后会存放到不同slot,也就是不同节点,所以在pipline时如果key值索引不在同一个slot,就会报上述错误
- 解决方式:如果不是同一类型的key值不要用pipline去操作,如果是同一类型,则用'{}’包裹住相同部分,因为这部分用于hash计算
- 例如:
redis.pipline().set('cache1', 1).set('cache2', 2).exec()
改为redis.pipline().set('{cache}1', 1).set('{cache}2', 2).exec()
- 原文档飞机票
eggjs修改文件reload问题(2017.8.30)
- 问题描述: 以开发环境启动项目,在修改文件后eggjs自动reload,但reload后所有请求都是pendding状态且所有log都是正常状态.
问题探索:
- 在eggjs的issue中发现了类似的问题,基本是修改文件后不能reload,需要crtl+c手动重启,解决方式基本是重新安装依赖,但一顿操作后仍然不行.
- 使用用脚手架新生成的项目仍然有这个问题
- 同事电脑上并没有出现这个问题
- 到官方issue提问,由于是个别现象大佬并不予解决
- 目前可以确定问题是由电脑造成的,且只有我出现了这个问题.既然没有现成的解决方法于是只有将希望寄托在了源码上.
解决问题:
- 在eggjs文档中可以发现负责reload的是
cluster-reload
模块,代码很简单,只有80+行,而且很容易读懂. - 在
reset()
中分别打印出newWorker
(重启后新的work进程)和firstWorker
(旧work进程)的状态,可以发现一切都是按照正常情况在进行,只不过在最后新的work进程莫名奇妙的是dead
状态,且没有触发任何重启. - 进行了一些尝试,最终有了一个成功的解决方案: 在
cluster.fork()
(fork新的work进程)前先firsterWorker.kill(KILL_SINGNAL)
(杀死旧进程).
- 在eggjs文档中可以发现负责reload的是
- 后记: 虽然没有找到真正的问题原因(还可以继续深挖)但解决了reload那个蛋疼的问题,但这种方法需要修改node_modules中的源码很不方便,而且只能用于开发过程中,生产环境中必须要优雅的推出进程.
Sequelize migrate changeColumn 问题
- 问题描述 修改字段类型报错
cannot be cast to type integer
数据库:Postgresql
报错原因: 将字段的数据类型由STRING
修改为INTEGER
(完全按照文档写法queryInterface.changeColumn(tableName: String, attributeName: String, dataTypeOrOptions: Object, options: Object)
),但通过Sequelize转换的sql语句存在问题,不适用于Postgresql,需要更改字段type的类型 解决问题
// 修改字段类型的代码应该为 queryInterface.changeColumn('table', 'column', { type: 'INTEGER USING CAST("column" as INTEGER)', allowNull: false, })
前端
Vuejs
element-ui popover报错(2018.02.09)
- 报错内容: [Vue warn]: Error in directive popover bind hook: “TypeError: Cannot read property ‘$refs’ of undefined”
代码
<template> <div> <i class="icon-help" v-popover:popoverHelp /> <Popover ref="popoverHelp" placement="top-start" title="标题" width="200" trigger="hover" content="这是一段内容,这是一段内容,这是一段内容,这是一段内容。" /> </div> </template> <script> import { Popover } from 'element-ui' export default { name: 'Manage', components: { Popover }, directives: { popover: Popover.directive } } </script>
- 解决
Popover的directive中只有一个bind生命周期的钩子,也只有一句代码vnode.context.$refs[binding.arg].$refs.reference = el;
,报错中的$refs就是整个组建中的refs,原来是<Popover />
写在了使用指令的后面,所以此时ref还没有在组件中注册,所以会报$refs undefined
错误 正确代码
<template> <div> <Popover ref="popoverHelp" placement="top-start" title="标题" width="200" trigger="hover" content="这是一段内容,这是一段内容,这是一段内容,这是一段内容。" /> <i class="icon-help" v-popover:popoverHelp /> </div> </template> <script> import { Popover } from 'element-ui' export default { name: 'Manage', components: { Popover }, directives: { popover: Popover.directive } } </script>