踩坑記[持續更新]

Leon發表於2017-09-26

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

後端

Node

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)(殺死舊程式).
  • 後記: 雖然沒有找到真正的問題原因(還可以繼續深挖)但解決了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,
    })

    issue詳情

前端

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>

相關文章