hagino3000's blog

平成アーカイブス (更新停止)

Server Side JavaScript を書いて思った事

というか、はまりまくったのでメモ。
Lotus Notes/Domino 8.5でLotus Scriptの代りにServer Side JavaScriptで同様に開発ができるとの事でやってみました。

サーバー・サイド JavaScript は XPages 用に用意された Lotus Domino サーバー上の ECMA 262 準拠のインタープリタで実行されます。NotesSession や NotesDocument などのNotes オブジェクトにアクセスするためのメソッドが用意されており、従来の NSF アプリケーションと同様のバックエンド処理を行うことができます。

IBM Lotus Notes/Domino 8.5 におけるアプリケーション開発

特定の構文が通らなかったりする

匿名関数を定義して即実行する記述があると、そこから先の処理が実行されない。例外も飛ばない。

(function(){
   print('hoge');
})();

一度、匿名関数を変数に入れてから実行しないとダメ。

なんか動作が違う

その辺のブラウザで次のコードを実行した場合。

var reg = /A/;

reg instanceof RegExp; // =>true

reg.constructor == RegExp; // =>true

Object.prototype.toString.apply(reg); // =>"[object RegExp]"


Lotus Notes上のJavaScriptインタプリタで実行した場合。

var reg = /A/;

reg instanceof RegExp; // =>false

reg.constructor == RegExp; // =>true

Object.prototype.toString.apply(reg); // =>exception

>HTTP JVM: スクリプトインタープリタエラー、
>行=XX、列=XX: タイプ「function」のオブジェクトで
>メソッド「apply(RegExp)」を呼び出し中にエラーが発生しました

オブジェクトが何なのか調べる時は constructorプロパティを使わないとダメっぽい。

コメント中に波括弧(中括弧)があると構文エラーとなりNotes Designerのエディタで保存できない。

バグかな?

String.prototype.replaceメソッドの第二引数にfunctionを渡しても動作しない。

ECMA-262の仕様書どおりなのでしょうがないのかも。(第二引数はStringのみ)
修正:ECMA 262 3rdでは第二引数にfunctionを取れます。

メソッドの上書きができない。

String.prototype.replace を上書きしても、上書き前のメソッドが呼び出されてしまったので。

catchできない例外が飛ぶ

というか、処理が唐突に終ってしまいエラーハンドリングできない。
原因判明、catchできていました。

try {
  // do hogehoge
} catch(e){
  try {
    print(e.message); // => exception
  } catch(e2) {
    print(typeof e); // => lotus.domino.NotesException
    print(e); // => エラーメッセージが表示できる

    print(e2); // => Java クラス 「lotus.domino.NotesException」のメンバー「name」が不明です。
  }
}

lotus.domino.NotesExceptionのmessageプロパティにアクセスすると、不明なプロパティだと言われてエラーになります。未定義のプロパティにアクセスするだけでエラーになる様です。

突然Javaになる

こんな感じで、StringだったらString.prototype.replaceを呼びだしたい時に……

function replaceHoge(value) {
  if (typeof value === 'string') {
    return value.replace(/hoge/g, "fuga"); // exception
  } 
}

>HTTP JVM: スクリプトインタープリターエラー、
>行=xx 列=xx Java classs [java.lang.String]上で
>メソッド「replace(regExp, string)] が見つかりません

というわけで

既存のライブラリを使おうとしても動きません。
開発元にフィードバックを送っているので、これからもっと良くなる事を期待しています。
クライアントサイドJavaScriptは実行環境によって動作が違いまくるという現状ですが、サーバーサイドはそうなって欲しくないですね。