2018年12月22日 星期六

Domino與Node.js


那天去上了IBMNode.js進行Domino新開發實戰的課程後,

回來本來是想分享一下想法,讓沒去的人也可以有點收穫,但一忙就忘了,今天補了起來,大家就加減看一下。

https://m.box.com/shared_item/https%3A%2F%2Fibm.box.com%2Fv%2Fdomino10nodejs

選擇node.js做為整合的對象,對notes來說是有很大意義,

node.js的語法就是JavaScript,如果有寫Web前端的程式,應該都很熟悉,也很容易上手。

一直以來Notes被詬病為封閉的系統,主要是因為不像其他程式,以RDB資料庫儲存data,任何程式都可以對資料加以新增修改刪除,而Notes卻只能寫好現成的程式讓人呼叫,總是不那麼自由。現在提供了一個module,一個API,在系統整合上算是跨出了一大步。

可惜的是目前只提供了在Linux環境下可使用。我對Linux的認識就停留在只會拼字,其他完全沒概念,所以只好等windows版本出來才能測試了。

回到JavaScript語法,JavaScript可以直接在瀏覽器端操控使用者的頁面,比起後端程式將request傳到Server執行計算結果再傳至瀏覽器,JavaScript的效率根本是個神。

可惜的是,之前認知的JavaScript都只是前端的程式,沒辦法跑在Server端,如果要取得資料,即使是ajaxweb service也還是要去呼叫後端的程式來執行。

xPages上的SSJS雖然名字中有JavaScript,是多了很多web觸發的event或部份更新套件,畢竟還是Server端的程式,而不是JavaScript

node.js實實在在就是在server端的JavaScript的語法。以那天上課的hello world為例,

console.log('hello world');

在命令字元上直接執行就可看到hello world的結果了。

開記事本寫入JavaScript程式後,存成xxxx.js的檔案,就變成一個可執行的module

在程式中若要使用其他模組中的function,只要require("xxxx.js")呼叫即可將其他modulefunction傳過來,可以想成是在lotus script中用include library後呼叫function

若是安裝了npm,可以從網路上直接引用別人寫好的module,取之不盡的現成module,是node.js之所以強大的其中一個原因,

而這次dominonode.js能夠整合,也是domino提供了現成的modulenode.js引用,只是目前這模組在網路上應該是找不到的,要自己下載到local端。

那天上課用的express module就是常用的module之一,要架一個web server,不再需要繁複的步驟,只要簡單幾行,全世界最簡便的web server就完成了。

var express = require('express');
var app = express();

app.listen(3000, function(){
        console.log('Example app listening on port 3000!');
});

(這是修改上課的例子,還是要註明一下以免被告)

把以上的程式存成index.js檔,然後在命令提示字元中下指令,
node index.js

就會執行這段程式,把web server架起來了,有沒有超強?

接下來要講的是第二個是我覺得node.js很重要的概念,當你程式執行後就常駐在server,其實並沒有看到任何的呈現,怎麼知道程式有在執行?

我們先回頭來說明一下listen那行的程式,這行的意思就是程式會持續不斷地監聽server port 3000

listen那行裡的function,是指當有人透過url連到port 3000時,就會觸發function的執行,

所以你就用browser連到server   http://xxxxx:3000

然後在server console上出現   Example app listening on port 3000!

很酷的是,這支function被當作listenmethod的一個參數,也就是當監聽到了就立馬去執行,

甚至也不用給它function name,這就叫做匿名程式,當然給了也可以,或是直接呼叫現成的function

總之,就是當有人連到serverport 3000時,在server console上就出現 Example app listening on port 3000! 這段字,表示程式執行了。

從一開始在server上以node index.js啟動這支index.js程式後,到最後console出現文字,

我們發現程式的執行是不對等、不同步的。

也就是,程式啟動後先跑了一部份,剩下的等有機會再傳回,這方法就叫做Callback

和我們以往的概念不同,試想,不管是.NET, PHPNotesweb程式執行的概念都是以url傳送requestserver

然後Web Server接收到請求後會建立一個procedure,再呼叫對應的程式執行,最後再產出後output,並結束procedure

這方法最大的問題在於,假設執行的後端程式非常輕量化時,inout這兩個動作就佔用了超過一半以上的資源和時間。

而每一次的執行,就會再開啟另一個新的procedure

比起早就等在路上的node.js的程序,這速度根本沒得比。

再借用一下IBM的圖,不要告我!


這支index.js常駐程式就一直監聽著port 3000,反覆地把request後送並傳回,有沒有很聰明?我不明白為什麼翻成事件驅動,但大致上就是這個概念。

我必須要強調的是,「假設執行的後端程式非常輕量化時」,也就是node.js的程式若是要處理的是大數據或要跑上數分鐘以上的大程式,

in/out所耗用的時間不成比例,用這方法就失去意義了。

node.js是單一執行緒,那天上課也有提到blockingnon-blocking,在說明之前要先強調,也就是說如果你寫的是blocking的程式一次就只能做一件事,當這支程式被呼叫時,下個呼叫者就必須等到前一次執行結束時才能繼續執行。

因此我們在操作時當然該多使用non-blocking的操作,在node.jsnon-blocking的程式碼運行順序和我們之前認知的有所不同,當你以如上例的callbackfunction的計算分散進行時,你可以想像成就像我們使用javascript呼叫ajax程式時,現有的程式也是同步併行,而不是以順序執行。

在程式規劃時就可以將更耗費資源的程式丟給另一支function去執行,只要二人約好,等等把執行完的結果丟在前面路口就可以了。

呃。。。不好意思,公司要發湯圓了,剩下的有興趣的人再上網去查資料吧。