JavaScriptで記述された拡張ORDS RESTハンドラ (2024/07/01)
JavaScriptで記述された拡張ORDS RESTハンドラ (2024/07/01)
https://blogs.oracle.com/developers/post/advanced-ords-rest-handlers-written-in-javascript
投稿者: Martin Bach
同僚のPeter O'Brien氏は、Oracle REST Data Service (ORDS)がリリース24.1.1以降のMultilingual Engine (MLE)/JavaScriptハンドラをサポートしていると指摘していました。これは素晴らしいです、そして、あなたはこの機能の動作を確認するために彼のブログの投稿を読む必要があります.この記事では、少し詳しく説明し、追加のユースケースについて説明します。
より複雑なJavaScriptコードはどうでしょうか。
MLEが導入されたときのOracle Database 21cと比較して、Oracle Database 23aiのMLE/JavaScriptの主な利点の1つは、JavaScriptモジュールを作成/使用する機能です。これらは、独自のモジュールまたはサード・パーティ・モジュールのいずれかです。このトピックは、このブログで広くカバーされています。ORDSチームの優秀なスタッフは、ORDSハンドラでMLEモジュールを簡単に使用できるようにしました。
いつものように、この記事をまとめるために使用されるコンポーネントのリストを次に示します。
- Oracle Database 23ai Free (23.4.0.24.05) on Oracle Linux 9.4 (x86-64) [ダウンロードリンク]
- ORDS 24.2.0 [ダウンロードリンク]
ITのすべてと同様に、詳細は変更される可能性があるため、この投稿がWeb検索で見つかった場合は、ドキュメントを確認してください。
コードを見せて
この例では、使用するアカウントに、JavaScriptコードを作成および実行するために必要なすべての権限(JavaScript開発者ガイドの第9章を参照)が付与されていることを前提としています。また、そのスキーマをREST対応と想定しています。このブログ記事で紹介されているコードはEMILYが所有しています。
JavaScript部分は最小限に抑えられます。
create or replace mle module demo_module
language javascript as
/**
* The minimum viable MLE example to use for a demonstration
* @params {string} question - the question to which you seek an answer
* @returns {string} the answer
*/
export function answer(question) {
return `the answer to ${question} is 42`;
}
/
-- The MLE environment is required later or else MLE would not know
-- how to map an import name to a MLE module
create or replace mle env demo_env
imports (
'jsdemo' module demo_module
);
データベースに対して発行した後、次にORDS部分を作成します。
警告: 次のORDSモジュールは、例を単純にするためにOAUTH2または同等のテクノロジを使用して保護されません。RESTエンドポイントを、適切な認証/認可およびロギング/監査などなしで本番に公開することはありません。
MLEモジュールおよび環境を整備して、ORDSモジュール、ハンドラおよびテンプレートを作成します。Peterの例に合せて、GETリクエスト・ハンドラが作成されます。これには質問のエンコーディングが必要ですが、ポイントを元に戻すには十分です。また、POSTリクエストを送信するよりも入力が少し少なくなります。
declare
c_module_name constant varchar2(255) := 'mle_ords_handler';
c_pattern constant varchar2(255) := 'answer/:question';
begin
ords.define_module(
p_module_name => c_module_name,
p_base_path => '/demojs/',
p_status => 'PUBLISHED',
p_items_per_page => 25,
p_comments => 'ORDS handling MLE/JavaScript modules and environments'
);
ords.define_template(
p_module_name => c_module_name,
p_pattern => c_pattern,
p_priority => 0,
p_etag_type => 'HASH',
p_etag_query => null,
p_comments => 'the question to which you need an answer'
);
ords.define_handler(
p_module_name => c_module_name,
p_pattern => c_pattern,
p_method => 'GET',
p_source_type => 'mle/javascript',
p_mle_env_name => 'DEMO_ENV',
p_items_per_page => 0,
p_mimes_allowed => null,
p_comments => null,
p_source => q'~
(req, resp) => {
// import question() from demo_module by means of the module's import name
const { answer } = await import ('jsdemo');
// not necessary since you cannot call this particular handler without a
// question but it's always good to test for unexpected behaviour
if (req.uri_parameters.question === undefined) {
resp.status(400);
} else {
const data = {
q: req.uri_parameters.question,
a: answer(req.uri_parameters.question)
};
resp.content_type('application/json');
resp.json(data);
}
}
~'
);
commit;
end;
/
モジュール、テンプレートおよびハンドラの定義は、Peterの元の例の後に厳密にモデル化されています。彼のコードに対する主な違いは、MLEに組み込まれていないモジュールを解決可能にするために必要なp_mle_env_name (行27)の使用です。DBMS_MLEを使用するすべての例(直接またはカバーの下)と同様に、行34で表示される動的なJavaScriptインポートを使用する必要があります。厳密に言えば、uri_parameterオブジェクトで質問要素をチェックする必要はありませんが、それを行うことは、将来のコード・リファクタリングの可能性から保護するための適切な方法です。
試してみよう!
テスト
ORDSモジュールで質問をスローします。
$ curl -s https://localhost:8443/ords/freepdb1/emily/demojs/answer/life%2C%20the%20universe%2C%20and%20everything | jq
{
"q": "life, the universe, and everything",
"a": "the answer to life, the universe, and everything is 42"
}
そこへ行きます!MLEに組み込まれているすべてのモジュールを使用する以外に、独自のモジュールを参照することもできます。ハッピーコーディング!
コメント
コメントを投稿