0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Node.js + Hapi + Couchbase ~ Node.js + NoSQL(Couchbase) アプリ開発 ステップバイステップガイド (3)

Last updated at Posted at 2021-01-28

はじめに

本シリーズの前回の記事では、WEBアプリケーション・フレームワークとして、Expressを用いました。
今回は、Hapiを使った例を紹介します。

利用バージョン

  • Couchbase Server: 6.6
  • Node.js: 15.4.0
  • Node.js モジュール
  • couchbase: 3.1.1
  • hapi: 18.1.0
  • uuid: 8.3.2

実装

Couchbase Server

以下、前提事項を記します。

バケット

利用するバケット(MyFirstBucket)が存在している

インデックス

検索で利用する項目に対して、インデックスが作成されている。

CREATE INDEX def_index_type ON MyFirstBucket(type)

ユーザー

利用するバケットに対するアクセス権のあるユーザー(Administrator)を利用する。

Node.js

ライブラリインストール

npm install couchbase hapi uuid --save

ソースコード

app.js
const Hapi = require("hapi");
const Couchbase = require("couchbase");
const UUID = require("uuid");
 
const server = Hapi.Server({"host":"localhost","port":3000,routes:{cors: {origin: ['*']}}});

var cluster = new Couchbase.Cluster(
    'couchbase://localhost',
    {
      username: 'Administrator',
      password: 'password'
    }
  );

const bucket = cluster.bucket("MyFirstBucket");
const collection = bucket.defaultCollection();
const typeName = "user";
const statement = "SELECT `"+bucket._name+"`.* FROM `"+bucket._name+"` WHERE type = '"+typeName+"'";

const selectUsers = async (key) => { 
  const result = await cluster.query(statement);
  return result.rows;
}

const upsertUser = async (doc) => {
  try {
    const key = UUID.v4();
    const result = await collection.upsert(key, doc);
  } catch (error) {
    console.error(error);
  }
};
 
const init = async() => {
  await server.start(error=>{
      if(error){
        throw error;
      }
    });
  return server;
};

init().then(server => {
  console.log('Server running at:', server.info.uri);
}).catch(err => {
  console.log(err);
});

server.route({
    method:"GET",
    path:"/users",
    handler: async (request,h)=>{
      const rows = await selectUsers();
      return h.response(rows);
    }
});

server.route({
    method:"POST",
    path:"/user",
    handler: async (request, h)=>{
      try {
        request.payload["type"] = typeName;
        const result = await collection.upsert(UUID.v4(),request.payload);
        return h.response(request.payload);
      } catch (error) {
        console.error(error);
        return h.response("").code(500);
      }
    }
});

実行確認

サーバー起動

$ node app.js

アクセス結果

image.png

最後に

次のステップとして、Vue.jsを用いたフロントエンド・アプリケーションとの連携を予定しています(今回作成したPOSTのAPI /userについては、そちらで利用例を紹介します)。

参考情報

Hapiは、バージョン17で、APIの大きな変更が行われています。新しいAPIについて、下記の記事を参考にしました(この記事では、データベースとしてMongoDBが使われています)。
Developing RESTful APIs with Hapi

Couchbase SDKも、メジャーアップデートにより、APIが大きく変更されています。
過去に発表された下記の二つの連続した記事では、古いバージョンが用いられていますが、基本構成の参考にしています。

Create a RESTful API with Node.js, Hapi, and Couchbase NoSQL

Going Full Stack with Node.js, Vue.js, and Couchbase NoSQL

0
0
1

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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?