2019年11月29日 星期五

nginx 設定提供不同版本api使用

目前提供給外部使用的API Server均透過nginx
以 location /api proxy到 nodejs 的服務上
為了要提供全新架構的api 服務
將以v1,v2區分新舊版本server
以下是nginxg上設定範例

location ^~ /api {
        rewrite ^/api(/.*)$ $1 break;
        #若要改預設主機 改這裡即可
        proxy_pass http://api_server_v1;
}
location ^~ /api/v1 {
        rewrite ^/api/v1(/.*)$ $1 break;
        proxy_pass http://api_server_v1;
}

location ^~ /api/v2 {
        rewrite ^/api/v2(/.*)$ $1 break;
        proxy_pass http://api_server_v2;
}
upstream api_server_v1 {
        server 127.0.0.1:12345;
}
upstream api_server_v2 {
        server 127.0.0.1:3138;
}

設定的結果
http://localhost/api/xxx 會導到v1主機
http://localhost/api/v1/xxx 會導到v1主機
http://localhost/api/v2/xxx 會導到v2主機

2019年11月28日 星期四

Linux上 cordova 9 plugin問題紀錄

在linux上build cordova app 使用plugin時遇到的幾個問題處理紀錄一下

1.Error:Using "requireCordovaModule" to load non-cordova module
  發生在ios 的plugin上
  只要將context.requireCordovaModule 改require即可
2.There was a conflict trying to modify attributes with
  plugin要改寫AndroidMenifest時,寫入時間點互相沖到
  導致未異動到AndroidMenifest
  可以使用--force 強制安裝
  cordova plugin add xxx --force
  之後把安裝有問題的plugin移除 重新安裝即可

2019年11月22日 星期五

在cordova 使用 oogle map 發生 getCurrentPosition PositionError:timeout expired問題

使用getCurrentPosition抓取使用者位置
一直都很正常使用
最近發現使用coodva build app 一直無法抓到使用者位置
但在web上卻很正常
看到的錯誤為 PositionError:timeout expired
查了一下 只要在option內開啟enableHighAccuracy 即可解決

navigator.geolocation.getCurrentPosition(
  function(msg){
    console.log(msg)
  },
  function(error){
    console.log(error)
  },
  {
    enableHighAccuracy: false,
    maximumAge: 60000,
    timeout: 45000
  })

2019年11月21日 星期四

Linux 開機 mount fstab設定

目前工作電腦使用了Window與Linux雙系統
在window os的那顆硬碟 切出了一個partition 並格式化為exfat
做為雙系統共用的partition
希望可以開機自動mount到指定的目錄使用
1.列出所有的partition 確認要mount 的是在哪個device
  ex:查到sda5 就知道要去mount /dev/sda5
  cat /proc/partitions

2.查device的UUID
  blkid

3.建立要mount點的目錄
  ex:在 /media下建立win_exfat當作mount點
  cd /media
  sudo -s
  mkdir win_exfat // 這是我要使用的目錄名稱
4.手動mount 到media下的目錄
  mount -t exfat /dev/sdb5 /media/win_exfat
5.要開機自動mount須 修改/etc/fstab
  依照其他的設定 加入一筆設定 依序幾個參數分別是
  file system: 對應到實體device ex: UUID=02D9-DDF8
  mount point:要mount使用的路徑 /media/win_exfat
  type:格式 exfat
  options:defaults
  dump:0
  pass:0

fstab設定參考

2019年11月20日 星期三

我的1988 未央歌

1988 那是個大學錄取率只有30%的年代
考得很爛 不到兩百分的分數 連交志願卡的資格都沒有
全班考上的沒有幾個
放榜後 大家都到補習班重考

高雄的補習街在七賢路
一整班上百人上課的大教室
天花板上整排明亮的日光燈
教室裡一排排的 長條桌椅
是還記得的畫面

高四的生活 像是高中生活的延續
只是原本同班同學 散落在同一條路上不同的補習班
交通工具 由腳踏車 換成黃黑色的小兜風
那是剛喜歡上 Bon Jovi Euroupe的年代

高雄火車站 還有老營長唱片行 放著Final Countdown
和平路上位在地下室的Subway 點一杯飲料可以坐上一個下午
那是個可以看到珍貴搖滾MTV的地方

剛接觸到西洋搖滾樂的滋味
國語唱片裡 大概只有羅大佑與紅螞蟻能讓我們服氣

那年 黃舒駿的第一張專輯 馬不停蹄的憂傷 發行
號稱要打倒羅大佑 看著那樣的宣傳 頗不以為然
不過這張唱片 卻與這段1988的記憶 緊密的結合在一起
馬不停蹄的憂傷 未央歌 都成為這段時光的音樂


2019年11月7日 星期四

Gulp4 Did you forget to signal async completion?錯誤

在gulp task內以aysnc執行多項工作
在完成後希望可以用process.exit關閉視窗
process.exit的呼叫必須是在done()之後才執行
否則報錯

sampe code

gulp.task('myjob', async (done) => {
  for(var i=0; i < 10; i++){
    // loop do something
    const response = await doSomething(i);
    console.log(response)
  }
  done()
  process.exit()
})

2019年11月5日 星期二

vue.config.js設定publicPath

使用vue-cli4建置新專案內
webpack的設定已經被包裝在整個架構下
大多數預設值即可符合開發需求
若需要手動執行webpack設定
則是寫在根目錄的vue.config.js內
通常會需要設定的部分包括
publicPath 預設是以/為路徑
因此產生出來的html檔案內所有的css 或js 路徑
都會是對應到根目錄的/js/xxx或 /css/xx的位置
如果你build出來的檔案是要放在web server的根目錄下
也就是http://localhost/下執行 這樣可以正常顯示

但如果是放在如http://localhost/abc/def/xxx目錄下
就會有找不到相關檔案的問題

必須將publicPath設定為'./'才會讓build出的檔案
可以放在任意目錄下執行

以下為範例

 const path = require('path')  
 module.exports = {  
  publicPath: './', // 預設為/ 所有html下的js css 連結都會是/js/xx,在輸出到web server 路徑會有問題,需用./  
  outputDir: 'www', // 輸出路徑  
  assetsDir: '', // 要輸出的asset目錄,設定hello,則會輸出成 hello/js/xxx,  
  devServer: {  
   port: 1234,  
   open: true  
  },  
  chainWebpack: config => {  
   config.module  
    .rule('yaml')  
    .test(/\.ya?ml$/)  
    .use('js-yaml-loader')  
    .loader('js-yaml-loader')  
    .end()  
   config.resolve.alias  
    .set('@@', path.resolve(__dirname)) // @@ 代替根目錄  
  }  
 }