用於記錄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)
(殺死舊程式).
- 在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>