TypeScript経由でSQLiteに書き込みする機能を作る

参照APIを作ったので今回はTypeScriptでデータベースにアクセスして書き込みする機能を作ります。言語のコンセプトとしてKVSの方が相性が良いと思いますが今回はSQLiteをデータ保持に使います。

概要

  • データ登録用APIを作成する
  • データをSQliteに書き込む

APIのインターフェース

POST /regist

環境の整備

Macには元々SQliteが入ってるのでNodeのSQLiteパッケージをインストール

$ sqlite3 --version  
3.32.3
$ npm install sqlite3

DB構築

$ sqlite3 testdb
sqlite> create table item(id, name);
sqlite> .schema item
CREATE TABLE item(id, name);
sqlite> 

テストデータの投入

sqlite> insert into item values (1,'item1');
sqlite> insert into item values (2,'テスト2');
sqlite> select * from item;
1|item1
2|テスト2
sqlite> 

プログラムの追加
登録内容の一覧を返す機能とPOSTリクエストをDBに登録する機能の2つを追加しました

import http, {IncomingMessage, ServerResponse} from 'http';
const sqlite3 = require("sqlite3");

type Item = {
  id: string
  name: string
}

const server = http.createServer((req: IncomingMessage, res: ServerResponse) => {
  res.writeHead(200, {'Content-Type' : 'application/json'});
  switch (req.url) {
    case '/list':
      const db = new sqlite3.Database("./testdb");
      db.all("select * from item", ( err:String, rows:Item[]) =>{
        let output = "";
        rows.forEach (item => {
          output += item.id + "/" + item.name + " "
        }); 
        res.write(output);
        res.end();
      });
      break;

    case '/regist':
      var body = '';
      req.on('data', function(chunk) {
        body += chunk;
      });
      req.on('end', function() {
        const body_split = body.split('&');
        const post_id = body_split[0].substring(3);
        const post_name = body_split[1].substring(5);
        const db = new sqlite3.Database("./testdb");
        db.run("insert into item values(?,?)", post_id, post_name);
      });
    res.write('registed');
      res.end();
      break;
  }
})
server.listen(4000)
||<<