[Nodejs] module.exports 與 exports 的差別

如果沒有接觸過 commonJs 這類可以將 js 模組化為檔案的開發者,剛開始寫 Nodejs 時可能會有點不懂 module.exports 與 exports 的差別 舉例來說: 有一個 player.js 這樣就產生了一個 player.js 這個模組 如果今天 main.js 想要使用這個模組,就可以透過 require 來引入模組 如: 再來我們看看使用 exports 新增一個 removePlayer 的方法 原因是在模組裡面其實會預先幫你做 預設當我們使用 exports 其實也代表更改了 module.exports 。 但當直接使用 module.exports = {…} 其實也就更改了模組對外公開的物件,因此更改 exports 時無法更改到 module.exports。   參考資料: https://program365.wordpress.com/2015/07/02/understanding-module-exports-and-exports-in-node-js/

Continue reading


[Nodejs] Weighted Random,帶有權重的隨機函式

前一陣子寫論文時,有用到一些輪盤法,用圖片簡言之 比如我們希望依照上方的圓餅圖的比例去選出A、B及C等項目。 選到A的機率為 20% 選到B的機率為 15% 選到C的機率為 10% 選到其他的機率為 55% 以下的程式碼為使用 Nodejs 實作這樣的帶有權重的隨飢函式 PS. 如果不想重複選的話,就需要有一個陣列記住哪些選過了~ 參考資料: http://www.blogjava.net/sevenduan/archive/2009/12/11/305552.html        

Continue reading


[nodejs] 同步執行迴圈(synchronous loop)實作

在使用 nodejs 時,大家都知道很多函式都是使用 callback 的方式來撰寫,但有時候我們可能希望同步的執行程式碼。 舉個例子: 比如我們要將多筆資料,一筆一筆的塞進去 mongoDB 藉由上面這段程式碼,我們會非同步的執行資料一筆一筆塞入 mongoDB 的動作,但這樣非同步的塞資料,可能會導致機器負載過高,甚至 mongoDB 無法負荷等等。 所以,有時候我們會希望是一筆一筆資料同步的塞進去,而不是非同步執行。 這時候,我們就可以使用 callback 的寫法來時做這個迴圈,如下程式碼: var i=0; var max=docs.length; (function insertData() { db.collection(‘data’).insertOne({….}, (err, result) => { i++; if(i<max) insertData(); }); }()); 這樣就可以保證一筆塞完成功後,才會再塞下一筆。上面程式碼有用到 IIFE(立即執行函式)

Continue reading


[npm] node package manager + node 如何使用一般使用者身份安裝 (linux 環境)

有些時候我們並不會擁有機器的 root 權限,如何在非 root 的情況下安裝 node 和 npm ps. 前提是系統必須裝有 C/C++ 的編譯器,如:gcc/g++   至 nodejs 官方網站,下載 source code 版本至家目錄 https://nodejs.org/en/download/ 解壓縮至家目錄 cd ~ tar -zxvf  node-v4.2.6.tar.gz  在家目錄創建 .npmrc 設定檔,加入以下內容 root = /home/YOUR-USERNAME/.local/lib/node_modules binroot = /home/YOUR-USERNAME/.local/bin manroot = /home/YOUR-USERNAME/.local/share/man 進入解壓縮後的目錄,開始做安裝目錄設定及編譯安裝( 我們將安裝在 ~/.local ,原本預設是/ur/local/.local ) ./configure –prefix=~/.local make make install  建立 symbolic link ,設定我們 require 時預設會找的目錄 cd […]

Continue reading