Technology Blogs by SAP
Learn how to extend and personalize SAP applications. Follow the SAP technology blog for insights into SAP BTP, ABAP, SAP Analytics Cloud, SAP HANA, and more.
cancel
Showing results for 
Search instead for 
Did you mean: 
Sawa_Ito
Product and Topic Expert
Product and Topic Expert
0 Kudos

このブログは、2022 年 11 月 15 日に SAP ジャパン公式ブログに掲載されたものを SAP ジャパン公式ブログ閉鎖に伴い転載したものです。




このブログは、 danielsblog01が執筆したブログ「 Let’s Build a Node.js App Powered by an SAP HANA Data Lake IQ!(2021 年 8 月 13 日)の抄訳です。最新の情報は、SAP Community の最新ブログマニュアルを参照してください。




 

このブログでは、スタンドアロンの SAP HANA Cloud, data lake インスタンスをベースにした Node.js アプリケーションの構築について説明します。ここでは、以下の 3 つの項目を完了させることをゴールにします。

    • SAP HANA Cloud, data lake インスタンスへの接続

 

    • データベースへのクエリーとデータの受信

 

    • 自分の Web ページからSAP HANA Cloud, data lake ファイルストアへのファイルのアップロード



これらの 3 つのシンプルなゴールで、Node.js と SAP HANA Cloud, data lake インスタンスで想像できるアプリケーション構築の第一歩となるでしょう。

 

 

 

ODBC を設定する


 

スタンドアロンの SAP HANA Cloud, data lake インスタンスへの接続の最初のステップは、適切な ODBC ドライバーを用意することから始まります。SAP HANA Cloud, data lake の ODBC ドライバーは、こちらのSAP HANA Cloud, data lake クライアントからダウンロードすることが可能です。
SAP HANA Cloud, data lake クライアントをインストールすると、「SAP HANA data lake 」 ODBC ドライバーもインストールされます。SAP HANA Cloud, data lake のベースとなるSAP IQ はもともと Sybase 社の技術であるという歴史的な背景があるため、システムにインストールされた ODBCドライバーの名称でもまだ「Sybase IQ」が使用されています。

ドライバーの特定後、DSN を作成します。Windows マシンでは、ODBC データソースアドミニストレーターで設定します。
UNIX マシンでは .odbc.ini ファイルで設定します。
SAP HANA Cloud, data lake への接続では、ドライバーは、ホスト、ポート、ユーザー ID、パスワードが必要です。ホストとポート情報は、SAP BTP Cockpit または SAP HANA Cloud Central から確認できます。

 



 

 

 

Node アプリケーションを作成する


 

DSN の設定が完了したら、Node アプリケーションの作成に移ります。最初のタスクはアプリケーションディレクトリーの作成です。ここでは「nodeapp」という名のディレクトリーを作成します。その後、npm init を実行し、node-gyp、odbc、nodemon、express、formidable をインストールします。
以下は、私の最終の package.json です。これをコピーして先のパッケージのインストールに使用することができます。

 

{

  "name": "nodeappblog",

  "version": "1.0.0",

  "description": "",

  "main": "index.js",

  "scripts": {

    "start": "nodemon index.js"

  },

  "author": "",

  "license": "ISC",

  "dependencies": {

    "express": "^4.17.1",

    "formidable": "^1.2.2",

    "node-gyp": "^8.1.0",

    "nodemon": "^2.0.12",

    "odbc": "^2.3.6"

  }

}


 

必要なパッケージをインストールしたら、SAP HANA Cloud, data lake ベースのアプリケーションの作業を始めます。
メインサーバー側のコードに「index.js」を作成します。
index.jsで、アプリケーションの作成に必要な全てのパッケージをインポートし、DSN で ODBC 接続するための基本のコードを書きます。

 

'use strict';



const express = require('express');

const fs = require('fs');

const formidable = require('formidable');

const odbc = require('odbc');

const https = require('https');



// Constants

const PORT = 8012;

const HOST = '0.0.0.0';



// App

const app = express();



app.get('/', (req, res) => {

    let conn = connectToDB()

        .then(conn => res.send('Database connection was successful!'))

        .catch(err => {

            res.send('Database connection failed.');

            console.log(err);

        });

});



app.listen(PORT, HOST);

console.log(`Running on http://${HOST}:${PORT}`);



async function connectToDB(){

    const cnxConfig = {

        connectionString: 'DSN=HDLDSN',

        connectionTimeout: 10,

        loginTimeout: 10,

    }

    return odbc.connect(cnxConfig);

}


 

コアの機能は、async connectToDB 関数で扱われます。
この関数は、odbc モジュールを使用して SAP HANA Cloud, data lake インスタンスへの接続を確立します。
また、接続に使用する DSN や、接続やログインタイムアウト時間などその他パラメーターを指定する cnxConfig 変数を使用します。

connectToDB 関数を作成したので、ポジティブテスト、ネガティブテスト、の両方のコードテストを行うことができます。
http://localhost:8012/ にアクセスして、先に設定した DSN でアプリケーションをテストすると、接続に成功したことを示す応答が得られました。

 



 

次に、エラーがでるか、無効な DSN でコードをテストします。予測したとおりの応答を得ることができました。

 



 

次に、データベースからデータが得られるか試します。

 

 

 

SAP HANA Cloud, data lake へクエリーを投げる


 

最初に新しいエンドポイントを作成し、IoTセンサーデータを格納している  SAP HANA Cloud, data lake のテーブルにクエリーを送ります。

 

app.get('/sensor-data', (req, res) => {

    let conn = connectToDB()

        .then(conn => conn.query("SELECT * FROM GENERATED_SENSOR_DATA;")

            .then(data => res.send(data))

            .catch(err => res.send('Query failed!')))

        .catch(err => res.send('Database connection failed.'));

});


 

このエンドポイントの機能は、最後のものの単純な拡張です。今回は、connectToDB 関数から返されたconn オブジェクトを使用してクエリーを送ります。
再度、容易にデバッグするために、クエリーと接続関数に catch 句を追加し、コードをテストします。幸いにも、失敗は正常に行われ、クエリーでデータが返されました。

 



 

SAP HANA Cloud, data lake からデータを得られようになったので、SAP HANA Cloud, data lake ファイルストアへファイルをアップロードするインターフェースを構築します。

 

 

SAP HANA Cloud, data lake ファイルストアのインターフェースを構築する


 

 

このセクションでは、特に  SAP HANA Cloud, data lake ファイルストアコマンドラインインターフェース (HDLFSCLI) など、いくつかの事前の設定を想定しています。
この設定では、証明書をいくつか生成、設定し、それらが SAP HANA Cloud, data lake で信頼されている必要があります。
自己署名証明書を使用した HDLFSCLI の設定の概要に関してはこちらのブログを参照してください。
HDLFSCLI の設定が重要なのは、SAP HANA Cloud, data lake ファイルストアと連携するためにHDLFS REST APIを使用する際に、同じ証明書を接続に使用できるからからです。次のステップは、ファイルのアップロードに役立つでしょう。この  index.js では、以下のエンドポイントを追加しています。

 

app.get('/upload-files', (req, res) => {

    res.sendFile('file_upload.html', {root: __dirname + '/html'});

});


 

これでアプリケーションディレクトリーに「html」というフォルダーを作成し、このフォルダー内に「file_upload.html」というファイルを作成します。その後、「file_upload.html」に以下のコンテンツを書いていきます。

 

<!DOCTYPE html>

<html>

    <body>

        <p>Click on the "Choose File" button to upload a file:</p>

        <form method="POST" action="/hdlfs-upload" enctype="multipart/form-data">

              <input type="file" id="myFile" name="filename">

              <input type="submit">

        </form>

    </body>

</html>


 

作成したエンドポイントは、静的 HTML ページを生成します。これは、SAP HANA Cloud, data lake ファイルストアへのファイルのアップロードのユーザーインターフェースとして機能します。http://localhost:8012/upload-files にアクセスしてインターフェースを確認します。

 



 

ユーザーインターフェースを確認したら、次は、ファイルを SAP HANA Cloud, data lake ファイルストアにアップロードするコードです。index.js に以下のラインを追加します。

 

app.post('/hdlfs-upload', uploadFiles);


 

uploadFiles 関数が、たいへんな作業が行われるところです。この関数は最終的に非常に大きくなりますが、細分化していくと、比較的簡単です。まず、formidableモジュールを使用してsubmit 時にフォームをパースします。これによって、ファイル名へのアクセスや、path と  name変数への絶対パスへのアクセスが便利になります。

 

function uploadFiles(req, res){

    var form = new formidable.IncomingForm();

    form.parse(req, function (err, fields, files) {

        let path = files.filename.path;

        let name = files.filename.name;

    });

}


 

次に、ファイルストア REST API へのリクエストのペイロードを作成します。キーとなるパラメーターは以下のオプション変数で確認できます。家で試みる場合には、ホスト名、x-sap-filecontainer、cert、キー値を設定に反映する必要があります。

 

function uploadFiles(req, res){

    var form = new formidable.IncomingForm();

    form.parse(req, function (err, fields, files) {

        let path = files.filename.path;

        let name = files.filename.name;

        let options = {

            hostname: '<YOUR_HOST_NAME>',

            port: 443,

            path: `/webhdfs/v1/${name}?op=CREATE&data=true&overwrite=true`,

            method: 'PUT',

            headers: {

                'Content-Type': 'application/octet-stream',

                'x-sap-filecontainer': '<YOUR_FILE_CONTAINER>'

            },

            connection: 'keep-alive',

            cert: fs.readFileSync( __dirname + '/client.crt' ),

            key: fs.readFileSync( __dirname + '/client.key' )

        }

        var fs_req = https.request(options, res => {

            console.log('statusCode:', res.statusCode);

            console.log('headers:', res.headers);

            res.on('data', (d) => {

                process.stdout.write(d);

            });

        });

        fs_req.on('error', (e) => {

            console.log(e);

        });

        fs_req.write(fs.readFileSync(path));

        fs_req.end();

    });

}


 

私はその後の自己署名の証明書で問題にぶつかりました。process.env[“NODE_TLS_REJECT_UNAUTHORIZED”] = 0; の設定が私の設定には必要でした。
なぜならば、Node.js が、私がリクエスト内で使用している自己署名証明書を好まなかったからです。この行は、家で試していて認証局の証明書を使用しているのであれば、省くことができます。

作成した関数の後半では、上記で指定したオプションで、ファイルストア REST API への httpリクエストを作成します。fs_req­ 変数は、ファイルストア API に特化したもので、fs_req.write(fs.readFileSync(path));は、 ファイルストリームをファイル作成先に送信します。

最後にコードをテストします。http://localhost:8012/upload-files にアクセスして、ファイルのアップロードを進めます。

 



 

Submit をクリックすると、Node.js コンソールでファイルがアップロードされたことがわかります。

 



 

アップロードが成功したか確認するもう一つの方法は、REST API または HDLFSCLI 経由で行う方法です。
この Node アプリケーションでファイルのアップロード状況を確認するには、エンドポイントをもう一つ追加します。
このエンドポイントは、SAP HANA Cloud, data lake ファイルストア API の list コマンドを使用して、ファイルストアに格納したファイルを一覧表示します。

 

app.get('/list-fs-status', (req, res) => {

    let options = {

        hostname: '<YOUR_HOST_NAME>',

        port: 443,

        path: `/webhdfs/v1?op=LISTSTATUS`,

        method: 'GET',

        headers: {

            'Content-Type': 'application/octet-stream',

            'x-sap-filecontainer': '<YOUR_FILE_CONTAINER>'

        },

        connection: 'keep-alive',

        cert: fs.readFileSync( __dirname + '/client.crt' ),

        key: fs.readFileSync( __dirname + '/client.key' )

    }



    var fs_req = https.request(options, fs_res => {

        console.log('statusCode:', res.statusCode);

        console.log('headers:', res.headers);

        fs_res.on('data', (d) => {

            process.stdout.write(d);

            res.write(d);

            res.end();

        });

    });

    fs_req.on('error', (e) => {

        console.log(e);

    });

    fs_req.end();

});


 

次に、エンドポイント URL  へアクセスし、ファイルがアップロードされたことを確認します。

 



ファイルのアップロードに成功したことが確認できましたので、このブログの内容を以下にまとめます。

 

 

まとめ


 

Node.js アプリケーションをSAP HANA Cloud, data lake インスタンス上に構築する方法を説明しました。
SAP HANA Cloud, data lake データベースに直接接続し、データベースにクエリーを投げ、結果を受けとり、SAP HANA Cloud, data lake ファイルストアにファイルをアップロードし、最後に、list コマンドを使用してSAP HANA Cloud, data lake ファイルストア内のファイルを確認しました。

Node.js アプリケーションで SAP HANA Cloud, data lake をどう利用するのか紹介しました。

ぜひお試しください。特定の業務の課題に関するアプリケーションを構築したわけではありませんが、上記のプロトタイプがスタート地点になるでしょう。