Skip to main content

Node.js からのクラス・メソッドの呼び出し

ここでは、ObjectScript クラス・メソッドを Node.js アプリケーションから直接呼び出すことを可能にするクラス Iris のメソッドを説明します。詳細および例は、以下のセクションを参照してください。

Note:

この章の例では、irisjs という名前の Iris オブジェクトが既に存在し、サーバに接続されていると想定します。これは、以下のコードを使用して作成し、接続されています。

const IRISNative = require('intersystems-iris')

// Open a connection to the server and create an Iris object
  let connectionInfo = {
    host: '127.0.0.1',
    port: 51773,
    ns: 'USER',
    user: 'username',
    pwd: 'password'
  };
const conn = IRISNative.createConnection(connectionInfo);
const irisjs = conn.createIris();

詳細は、createConnection() および createIris() のクイック・リファレンスのエントリを参照してください。

Node.js からのクラス・メソッドの呼び出し

classMethodValue() メソッドと classMethodVoid() メソッドは、ほとんどの目的に使用できますが、特定の返りタイプが必要な場合は、classMethodBoolean()、classMethodBytes()、classMethodDecimal()、classMethodNumber()、classMethodIRISList()、classMethodBigInt()、classMethodObject()、および classMethodString() の Iris.classMethodValue() 型キャスト・メソッドも使用できます。

これらのメソッドはすべて、class_name および method_name の文字列引数に加え、0 個以上のメソッド引数を取ります。

以下の例のコードでは、User.NativeTest という名前の ObjectScript テスト・クラスからいくつかのデータ型のクラス・メソッドを呼び出します(このセクションの最後に示す “ObjectScript クラス User.NativeTest” を参照)。

Node.js からの ObjectScript クラス・メソッドの呼び出し

この例のコードでは、サポートされている各データ型のクラス・メソッドを ObjectScript テスト・クラス User.NativeTest から呼び出します (この例の直後に表示されています)。変数 irisjs はクラス Iris の以前に定義されたインスタンスで、現在サーバに接続されていると想定します (“Node.js での接続の作成” を参照)。

  const className = 'User.NativeTest';
  let cmValue = "";
  let comment = "";

  comment = ".cmBoolean() tests whether arguments 2 and 3 are equal: "
  cmValue = irisjs.classMethodBoolean(className,'cmBoolean',2,3);
  console.log(className + comment + cmValue);

  comment = ".cmBytes() returns integer arguments 72,105,33 as a byte array (string value 'Hi!'): "
  cmValue = irisjs.classMethodBytes(className,'cmBytes',72,105,33); //ASCII 'Hi!'
  console.log(className + comment + cmValue);

  comment = ".cmString() concatenates 'Hello' with argument string 'World': "
  cmValue = irisjs.classMethodString(className,'cmString','World');
  console.log(className + comment + cmValue);

  comment = ".cmLong() returns the sum of arguments 7+8: "
  cmValue = irisjs.classMethodBigInt(className,'cmLong',7,8);
  console.log(className + comment + cmValue);

  comment = ".cmDouble() multiplies argument 4.5 by 1.5: "
  cmValue = irisjs.classMethodNumber(className,'cmDouble',4.5);
  console.log(className + comment + cmValue);

  comment = ".cmList() returns a $LIST containing arguments 'The answer is ' and 42: "
  cmValue = irisjs.classMethodIRISList(className,"cmList","The answer is ",42);
  console.log(className + comment+cmValue.get(1)+cmValue.get(2) )

  comment = ".cmVoid() assigns argument value 75 to global node ^cmGlobal: "
  try {
    irisjs.kill('cmGlobal') // delete old ^cmGlobal if it exists
    irisjs.classMethodVoid(className,'cmVoid',75);
    cmValue = irisjs.get("cmGlobal");  //get current value of ^cmGlobal
  }
  catch {cmValue = 'method failed.'}
  console.log(className + comment + cmValue);

この例では、サポートされている各型に対する classMethodValue() 型キャスト・メソッドについて説明します。classMethodValue() (型指定のない値を返す) および classMethodObject() ("“Node.js からのデータベース・オブジェクトの制御”" で説明) については省略しています。

ObjectScript クラス User.NativeTest

前の例を実行するには、この ObjectScript クラスがコンパイルされ、サーバで使用可能である必要があります。


Class User.NativeTest Extends %Persistent
  {

  ClassMethod cmBoolean(cm1 As %Integer, cm2 As %Integer) As %Boolean
  {
     Quit (cm1=cm2)
  }

  ClassMethod cmBytes(cm1 As %Integer, cm2 As %Integer, cm3 As %Integer) As %Binary
  {
     Quit $CHAR(cm1,cm2,cm3)
  }

  ClassMethod cmString(cm1 As %String) As %String
  {
     Quit "Hello "_cm1
  }

  ClassMethod cmLong(cm1 As %Integer, cm2 As %Integer) As %Integer
  {
     Quit cm1+cm2
  }

  ClassMethod cmDouble(cm1 As %Double) As %Double
  {
     Quit cm1 * 1.5
  }

  ClassMethod cmVoid(cm1 As %Integer)
  {
     Set ^cmGlobal=cm1
     Quit
  }

  ClassMethod cmList(cm1 As %String, cm2 As %Integer)
  {
     Set list = $LISTBUILD(cm1,cm2)
     Quit list
  }
}

ターミナルからこれらのメソッドを呼び出すことで、それらをテストできます。例を以下に示します。

USER>write ##class(User.NativeTest).cmString("World")
Hello World
Note:
関数とプロシージャ

以前のバージョンの Native SDK では、ObjectScript の関数やプロシージャに直接アクセスするメソッドが提供されていました。これらのメソッドはセキュリティ上の懸念により削除されました。呼び出した場合、サーバ・エラーを返します。関数やプロシージャは、ObjectScript ラッパー・クラスでメソッドとして利用可能にすることで、引き続き間接的に呼び出すことができます。

引数の参照渡し

InterSystems クラス・ライブラリのほとんどのクラスでは、メソッドが %StatusOpens in a new tab 値のみを返す呼び出し規則を使用します。実際の結果は、参照によって渡される引数で返されます。Native SDK では、メソッドで参照渡しがサポートされます。これには、以下のように引数の値をクラス IRISReference のインスタンスに割り当て、そのインスタンスを引数として渡します。

  const IRISNative = require('intersystems-iris')
  var ref_object = new IRISNative.IRISReference(null) // set initial value to 0
  var status = irisjs.classMethodObject("%SomeClass","SomeMethod", arglist, ref_object);
  var returned_value = ref_object.getValue();  // get the method result

以下の例では、標準のクラス・ライブラリ・メソッドが呼び出されます。

参照渡し引数の使用

この例は、%SYS.DatabaseQuery.GetDatabaseFreeSpace()Opens in a new tab を呼び出して、iristemp データベースで利用可能な空き容量の量 (MB 単位) を取得します。

  const IRISNative = require('intersystems-iris')
  var freeMB = new IRISNative.IRISReference(null) // set initial value to 0
  const dir = "C:/InterSystems/IRIS/mgr/iristemp" // directory to be tested
  var value = "error"
  var status = 0

  console.log("Type of freeMB = "+ (typeof freeMB) + ", value = " + freeMB.getValue())
  try{
    console.log("Calling %SYS.DatabaseQuery.GetDatabaseFreeSpace()... ")
    status = irisjs.classMethodObject("%SYS.DatabaseQuery","GetDatabaseFreeSpace",dir,freeMB)
    value = freeMB.getValue()
  } catch {
    console.log("Call to class method GetDatabaseFreeSpace() returned error:")
  }
  console.log("(status=" + status + ") Free space in " + dir + " = " + value + "MB\n")
}

出力 :

Type of freeMB=str(type(freeMB)), value=null
Calling %SYS.DatabaseQuery.GetDatabaseFreeSpace()...
(status=1) Free space in C:/InterSystems/IRIS/mgr/iristemp = 10MB
FeedbackOpens in a new tab