踩坑記[持續更新]

用於記錄coding過程當中遇到的比較難解決或者有意思的問題,包括前端/後端(Node/Db),會持續更新...javascript

後端

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都是正常狀態.
  • 問題探索:java

    • 在eggjs的issue中發現了相似的問題,基本是修改文件後不能reload,須要crtl+c手動重啓,解決方式基本是從新安裝依賴,但一頓操做後仍然不行.
    • 使用用腳手架新生成的項目仍然有這個問題
    • 同事電腦上並無出現這個問題
    • 到官方issue提問,因爲是個別現象大佬並不予解決
    • 目前能夠肯定問題是由電腦形成的,且只有我出現了這個問題.既然沒有現成的解決方法因而只有將但願寄託在了源碼上.
  • 解決問題: node

    • 在eggjs文檔中能夠發現負責reload的是cluster-reload模塊,代碼很簡單,只有80+行,並且很容易讀懂.
    • reset()中分別打印出newWorker(重啓後新的work進程)和firstWorker(舊work進程)的狀態,能夠發現一切都是按照正常狀況在進行,只不過在最後新的work進程莫名奇妙的是dead狀態,且沒有觸發任何重啓.
    • 進行了一些嘗試,最終有了一個成功的解決方案: 在cluster.fork()(fork新的work進程)前先firsterWorker.kill(KILL_SINGNAL)(殺死舊進程).
  • 後記: 雖然沒有找到真正的問題緣由(還能夠繼續深挖)但解決了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的類型
  • 解決問題git

    // 修改字段類型的代碼應該爲
    queryInterface.changeColumn('table', 'column', {
      type: 'INTEGER USING CAST("column" as INTEGER)',
      allowNull: false,
    })

    issue詳情github

前端

Vuejs

element-ui popover報錯(2018.02.09)

  • 報錯內容: [Vue warn]: Error in directive popover bind hook: "TypeError: Cannot read property '$refs' of undefined"
  • 代碼redis

    <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錯誤
  • 正確代碼sql

    <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>
相關文章
相關標籤/搜索