LoginSignup
12
2

More than 1 year has passed since last update.

Node.jsを使って、BigQueryからデータを取得するWebAPIを作る

Last updated at Posted at 2022-12-06

はじめに

これは 株式会社 RetailAI X Advent Calendar 2022 の 7 日目の記事です。
昨日は @murayamaxxx さんの記事でした。 entで実行されたSQLを確認する

本日は『Node.jsを使って、BigQueryからデータを取得するWebAPIを作る』です。

昨今、日本の企業間でクラウド化が進んでおり、一つのシステムを作るときGCPやAWSといったクラウドサービスと連携させた機能を実装する場面が増えてきているのではないかと感じます。

今回はGCPのBigQueryからデータを取得する簡単なWebAPIをNode.jsで作成してみました。

前準備

  • BigQueryで任意のデータセット、テーブルを作成する
  • 適切な権限を付けたサービスアカウントを作成し、jsonキーを任意のディレクトリにダウンロードする
  • 開発するディレクトリを準備し、Node.jsの環境を構築する
mkdir test
cd test
npm init -f
npm install --save @google-cloud/bigquery,express
vi sample.js

BigQueryからデータを取得する部分を実装する

Node.jsでGCPのサービスを使うためのライブラリが豊富にあるので、BigQueryのライブラリを使って実装していきます。

sample.js
const { BigQuery } = require('@google-cloud/bigquery');

const bigquery = new BigQuery({
    projectId: 'xxxxxx-xxxxxx-xxxxxx',
    keyFilename: 'xxx/xxx/xxx.json'
});

const query = "SELECT * FROM test_dataset.test_table";

bigquery.query(query)
    .then(data => {
        const rows = data[0];
        rows.forEach(row => {
            console.log(JSON.stringify(row));
        })
    })
    .catch(error => {
        console.log(error);
    });

BigQueryへのアクセスには必ずjsonキーが必要になります。

node sample.js

{"id":1,"name":"加藤","gender":"man"}
{"id":3,"name":"小松","gender":"man"}
{"id":2,"name":"関","gender":"woman"}
{"id":4,"name":"馬場","gender":"woman"}

WebAPIを実装する

Node.jsのExpressというWebアプリケーションフレームワークを使っていきます。
Node.jsで多く利用されている3大フレームワーク(Express,Meteor,Sails)の一つで、
GET/POST通信などを簡単な記述で実装できる魅力があり、今回の実装でもその魅力を活用しています。

const express = require("express")
const app = express();

app.get("/test/:gender", (req, res) => {

    const { BigQuery } = require('@google-cloud/bigquery');

    const bigquery = new BigQuery({
        projectId: 'xxxxxx-xxxxxx-xxxxxx',
        keyFilename: 'xxx/xxx/xxx.json'
    });

    const query = "SELECT ARRAY(SELECT name FROM test_dataset.test_table WHERE gender = '" + req.params.gender + "') AS human_list";

    bigquery.query(query)
        .then(data => {
            const rows = data[0];
            rows.forEach(row => {
                console.log(JSON.stringify(row));
                res.send(row);
            })
        })
        .catch(error => {
            console.log(error);
        });
});

app.listen(8080);
console.log("server listening...");

GETリクエストの際にgenderをman/womanで指定するとman/womanの名前がリストでレスポンスされる仕様です。
動作確認
http://localhost:8080/test/man
image.png

終わりに

Node.jsにあるExpressなどのフレームワークを使用すると、比較的簡単にWebAPIを作成できる印象で、
GCPなどのクラウドサービスと連携させた機能について、BigQuery以外にも試してみたいと感じました!!

明日 8 日目の記事は @atsukish さんの 『【MLOps】Vertex AIによるモデルモニタリングサービスの構築』 です。
個人的にもMLOpsに興味があるので楽しみです!次回もお楽しみに

参考

12
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
2