發表文章

目前顯示的是 2月, 2017的文章

Node.js Async套件

關於Node.js的 Async ,針對會使用這個套件的原因大概描述一下: 一、狀況 寫作Node.js專案時,由於單執行序與事件驅動的特性,勢必須要面對依序執行函式,或要拜訪每個陣列元素又要避免佔用執行序太久的狀況,先說明一下案例 1.依序執行function:如果碰到需要執行多個function,且每個function之間有前後關係時,如果不使用Promise語法或Async套件,你就只能一層又一層的寫下去,類似下面這樣 function a(callBack){     return callBack(null , "a done"); } function b(callBack){     return callBack(null , "b done"); } function c(callBack){     return callBack(null , "c done"); } a(function(error , rtn){     console.log(rtn);     b(function(error , rtn){         console.log(rtn);         c(function(error , rtn){             console.log(rtn);         });     }); }); //output: a done b done c done 如同上面範例看到的,為了保證依序執行,必須這樣一層一層的寫下去,請想想一下四層或五層,中間再加上一些邏輯判斷,有些要執行有些又不需要執行等,原始碼會變得很複雜難以閱讀跟維護。 2.執行迴圈辦法陣列物件: 比如你有一個物件陣列,要一一比對每個值,挑選出需要的物件 var array1 = [{ type:1,name:"p1"} , { type:2,name:"p2"} , { type:1,name:"p3"}]; var array2 = []; array1.forEach(function(item){     if(item.type

VSCode+Nodejs+Winston無法顯示訊息於console panel

圖片
這是上週發現的問題,那時候查了一上午找不到原因,今天再google一下,終於看到有其他人討論這個問題了,記錄一下讓碰到相同問題的也能知道狀況 github上的討論串在此有興趣的就直接去看一下吧: 連結在此 大概說明一下開發環境: VSCode 1.9.1 Nodejs 6.9.4 Winston 2.3.1 VSCode針對Nodejs 6.3以上的版本,.vscode/launch.json的debug參數設定type需設為node2,用以對應 V8 Inspector Protocol的--inspect,相關細節請看 官網連結 。 然後上週忽然意外就發生了,所有透過winston打算顯示在console panel上的訊息都無法顯示,一直到今天才在網路上找到上面列的討論串,目前問題還未解決,winston專案上有開啟了一個Issue,希望能早點更新,暫時的解法: 先於終端機執行要除錯的程式 node --inspect=17007 --debug-brk --nolazy app.js 這時應該會看到一行v8提示的訊息類似下面的範例 To start debugging, open the following URL in Chrome: chrome-devtools://devtools/remote/serve_file/@60cd6e859b9f557d2312f5bf532f6aec5f284980/inspector.html?experiments=true&v8only=true&ws=127.0.0.1:17007/c49a1bf5-9d3e-452b-9b7e-2f09b49e2e44 這時候複製這個url到chrome開啟分頁,會進入chrome devtools,於此執行,然後呢??請放心chrome的console panel依然不會顯示winston拋出的訊息,不過這時候你會發現,剛剛執行node命令的終端機視窗會出現那些消失的訊息了,像下面這樣: 雖然不方便,不過勉強堪用,在還未更新之前,就先這樣除錯吧 後續修改: 今天測試發現,只要把launch.json中的 "console" 值,設為"integratedTe

Linux下簡單的備份MongoDB

大概的想法是寫個簡單的sh,內容為自動備份mongodb並上傳到aws s3中,然後設定排程執行即可 1.建立sh檔 打算讓某個user來執行,所以在這個user的目錄下建立的scripts資料夾,並產生檔案,名稱就設定為:mongodb_backup.sh # 產生檔案名稱使用的時間字串,格式範例20170101120101 TIME=`date +%Y%m%d%H%M%S` # 備份檔案的目標目錄 DEST=/home/user/backups/DB-$TIME # mongodb擁有備份權限的username與密碼 DBUser="user" DBUserPassword="password" # 打包檔案的目錄 TarFile=/home/user/backups/DB-$TIME.tar # S3的bucket名稱 S3Bucket=bucketName #建立備份目標目錄 mkdir $DEST #執行整個db的備份 mongodump -u $DBUser -p $DBUserPassword -o $DEST #打包 tar -cvf $TarFile $DEST #上傳檔案至s3 aws s3 cp $TarFile s3://$S3Bucket/ #不想保留檔案可以在移除local的備份檔跟tar檔 2.建立好mongodb_backup.sh後,執行crontab -e建立排程 0 0,8,16, * * * /home/user/scripts/mongodb_backup.sh 執行的時間自己設定,我設定在目標user的crontab中,有需要也可以設定到系統排程裡面,不過相關目錄就需要調整了 3.後續 crontab執行排程時發生permission denied,沒有權限的錯誤,由於我是使用某個linux user的身分執行,檔案又放在user的目錄下,似乎因此導致job沒有執行權限,這部份我還不太熟悉,要找機會研究一下差異.... 總之先把執行的權限打開 chmod +x mongodb_backup.sh 之後運作就正常了

Amazon Linux的aws configure設定問題

這幾天工作上碰到一些關於AWS EC2的需求,針對使用Amazon Linux的Instance,打算把資料上傳到AWS S3的Bucket,上網查了一下,可以在命令視窗使用aws指令,不過需先設定configure,指令為aws configure,之後系統會要求輸入相關參數 [ec2-user@ip-xxx-xx-xx-xxx ~]$ aws configure AWS Access Key ID [None]: accessId AWS Secret Access Key [None]: accessKey Default region name [None]: us-west-2 Default output format [None]: 像上面後就可以正確執行了,之前發生問題的部份是Default region name這個項目,由於S3 Bucket的Properties中,顯示的Region為Tokyo,一開始就填成Tokyo了,結果就是怎麼嘗試上傳資料到S3都失敗。 一直出現下面顯示的錯誤 aws s3  Missing required header for this request: x-amz-content-sha256 改成 us-west-2 就沒事了.... 順便記錄一下抓取S3資料得語法 aws s3 cp s3://BucketName/path/filename toFileName

MongoDB啟用權限機制

目前使用的是mongodb 3.4版本,簡單的啟用權限機制的方式如下,其他較細緻的設定請看 檢核表 : 1.先進入mongoDB建立帳號 於mongoDB中,切換到admin db於此建立所有DB的admin帳號 use admin db.createUser(   {     user: "myUserAdmin",     pwd: "abc123",     roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]   } ) userAdminAnyDatabase此role能管理mongodb中各db的權限,利用此帳號就可以新增其他帳號,並分配帳號管理不同db,另外只擁有這個role是不能查詢與異動其他db的喔 其他Role的資料請參考 官網連結 2.建立好之後,離開mongo並已開啟auth的狀態重新啟用mongodb 命令列模式: mongod --auth --port 27017 --dbpath /data/db1 也可透過conf檔設定,預設使用/etc/mongod.conf,開啟authorization的方式,於conf檔案中加上 security:   authorization: enabled security:表示安全相關設定 security.authorization: security的子項目,enabled表示啟動權限機制 注意conf檔案中的"authorization:"與"enabled"中間要有一個空格,否則會發生錯誤 編輯完成後,重新啟動mongodb,之後就需要使用帳號進行登入了 3.新增帳號 重啟後進入mongodb,發法有兩種, 3.1.利用參數進入 mongo -u "myUserAdmin" -p "abc123" --authenticationDatabase "admin" 3.2.進入後再切換使用者 3.2.1進入mongo mongo 3.2.2切換使用者 use admin d

Amazon Linux下升級MongoDB 3.2 to 3.4

由於之前安裝時,是使用yum進行安裝,mongodb官方文件也建議使用yum進行套件管理。 目前版本為3.2版,目標是升級到3.4版。 1.先產生下面文件於yum的套件管理目錄/etc/yum.repos.d/mongodb-org-3.4.repo 內容如下: [mongodb-org-3.4] name=MongoDB Repository baseurl=https://repo.mongodb.org/yum/amazon/2013.03/mongodb-org/3.4/x86_64/ gpgcheck=1 enabled=1 gpgkey=https://www.mongodb.org/static/pgp/server-3.4.asc 2.接著執行yum的update 可先確認一下是否可以升級 yum list updates 有看到mongodb 3.4的內容就沒問題了 sudo yum update 這個指令會升級所有能升級的套件,如果只想升級mongodb後面記得放上套件名稱 sudo yum update mongodb-org 3.完成升級後,重新啟動服務 sudo service mongodb restart 4.相容性設定調整 重啟完成後進入mongodb就可以看到目前已經使用新版本在執行了, 需注意的是目前相容性設定應該還是設為3.2,如果已經確定不會有降級的需求,就可以調整為3.4了 注意喔 ,一旦調整到3.4,就會使用不相容於之前版本的功能,如果因為某些原因需要降級時,將會變得很複雜,所以官方建議可先執行一段時間,確定沒什麼問題了在進行調整 語法如下: db.adminCommand({setFeatureCompatibilityVersion:'3.4'})