Category Archives: nodejs

同一個port同時支援http/https

在nodejs下 httpolyglot套件可以讓server在同一個port同時支援http/https 其原理是透過偵測第一個byte 的差異來決定這條連線要走http or https TLS的一開頭 record header 第一個byte是0x16,在HTTP裡的第一個byte不會出現此數值。 參考: https://tls.ulfheim.net/ https://github.com/mscdex/httpolyglot

Posted in nodejs | Leave a comment

Object.defineProperty

Object.defineProperty(obj, prop, descriptor) descriptor分成data descriptor和access descriptor,兩者不能混用。 If a descriptor has neither of value, writable, get and set keys, it is treated as a data descriptor. If a descriptor has both value or writable and get or set keys, an exception … Continue reading

Posted in nodejs | Leave a comment

mongodb connect slow

在實際mongoose連線時,發現使用mongodb://localhost/db連線常常要好幾十秒才會建起來,而mongodb://127.0.0.1/db就馬上可以連上,追蹤了底層發現原因主要是mongodb-core 3.x他預設是使用tcp family 6的參數建連線,如果在系統內沒有正確設定localhost對應的ipv6 dns lookup (/etc/hosts ::1 或是 external dns的ipv6 dnslookup)就會等到查詢timeout,這時候mongodb nodejs driver才改用family 4的參數連線 node_modules/mongodb-core/lib/connection/connection.js 而127.0.0.1連線時,也是會帶family 6去連,但是在nodejs net.createConnection會進行dns.lookup 而 dns.lookup會再檢查一次字串是否為ip以及解出對應的family https://github.com/nodejs/node/blob/master/lib/dns.js 這類的問題比較麻煩的是在不同的機器上不一定能reproduce,有可能ipv6 localhost設定正確或是對外查詢dns可以正常查到,所以在追問題的時候仍需從經過的source code著手

Posted in nodejs | Leave a comment

exit process with delay

在nodejs中處理error發生要結束process時,可使用process.exit,但注意process.exit會立即返回特別是當要寫error log時,有可能還沒寫完就結束process了。這種情況可以利用timer來控制這裡節錄stackoverflow上的一個解法 Exit Node.js process after event loop is empty OR after timeout 以下節錄 如果時間到 event loop不為空,仍然會執行process.exit,中斷未完成的task。當然這邊會有其他的問題,因為通常發生異常必須結束時,會希望取消其他進行中的async task,單純記上error log,但許多async api並沒有取消的方式。

Posted in nodejs | Leave a comment

expressjs send file

在 expressjs傳送檔案可以直接使用res.sendFile或是開啟readable stream再pipe到res fs.createReadStream(fpath).pipe(res) 但在某些情況(例如video播放)這樣的方式太陽春,沒辦法seek (http byte range request) 特別是例如iOS safari browser在播放mp4影片時,會要求伺服器支援byte range request,不然不會播放。Safari Web Content Guide#Configuring Your Server HTTP servers hosting media files for iOS must support byte-range requests, which iOS uses to perform random access in media playback. … Continue reading

Posted in nodejs | Leave a comment

moment.js

在js的程式哩,對於時間格式處理解析與驗證可以使用momentjs, 下面簡要整理 處理不同版本js的Date對於字串解析的不一致 var a = new Date(‘2016-01-01’); ES5(解成UTC), ES2015(解成local time) mutable: t.add(1, ‘days’) 這樣會直接影響到t,如果要重複操作時 t.clone().add(1, ‘days’), value可為負數 避免在操作 add傳入小數點 處理timezone相關問題時要注意DST, daylight saving time 儘量使用.format(…)顯示描述轉成字串的格式 moment.utc(), moment().utc() 可以理解成目前是UTC timezone moment距離 x.diff(y) => x減去y 回傳 milliseconds moment.duration(milliseconds number) 再用 asDays()等的function轉單位 解析時間: … Continue reading

Posted in nodejs | Leave a comment

let scope

雖然let引入block scope,避免了var的variable hoisting,但是須注意 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/let let bindings are created at the top of the (block) scope containing the declaration, commonly referred to as “hoisting”. Unlike variables declared with var, which will start with the value undefined, let variables are not initialized … Continue reading

Posted in nodejs | Leave a comment

JSON5

JSON5 (https://spec.json5.org) https://github.com/json5/json5 nodejs讀取設定檔常使用json格式(http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf, https://tools.ietf.org/html/rfc8259), 但是json在描述時限制較多,例如在key要雙引號,字串要用雙引號不能用單引號,不能有註解等。 因此可讀性變差,JSON5主要將ECMAScript 5.1語法引入,整體看來,syntax對於熟悉javascript的使用者更友善 幾個比較大的差異 key不一定需要引號(根據ECMAScript 5.1 IdentifierName規則) Objects may have a single trailing comma. Arrays may have a single trailing comma. Strings may be single quoted/支援多行/支援 \x的escape (U+0000 through U+00FF) String更寬容的escape字元包含 JSON:All Unicode characters may … Continue reading

Posted in nodejs | Leave a comment

rootpath module

https://www.npmjs.com/package/rootpath 在vsphere rest sdk sample看到的一個用法,這對於library更動目錄時不需要再改寫require path非常方便,但是須注意webpack使用時,應該用webpack resolve configuration來處理

Posted in nodejs | Leave a comment

callback style與promise的整合

在需要呼叫多次callback時,async await可改善callback hell的現象而nodejs在8.x支援原生的async await,在設計callback api時,可設計成同時支援舊的callback style與新的promise style,這樣一來可以使api同時支援’async’ library與async/await語法 作法1: 作法2: 參考: https://zaiste.net/node_js_functions_simultaneously_supporting_callbacks_promises/ 使用:

Posted in nodejs | Leave a comment