ブログプロジェクト2-2:主な開発-MariaDB

2525 ワード

1.なに?


MariaDBは、SQLによるデータベース管理をサポートするオープンソースDBMSです.

2.なぜ使うのですか。


モンゴDBやGoogle FirebaseなどのNoSQL DBのような選択肢もありますが、筆者はSQLに詳しいので、学習による開発時間の増加よりも、スピーディーに理解できるものを利用するのが好きだと思います.個人的なプロジェクトなので、費用がかからないオープンソースDBMSであるMariaDBを使うことにしました.

3.適用方法

  • NPMでmysqlパッケージをダウンロードしました.
  • mysql.createConnectionでdbオブジェクトを作成しました.
  • db.js
    var mysql = require('mysql2');
    
    const db = mysql.createConnection({
      host:'',
      user:'',
      password:'',
      database:'myblog'
    });
    
    module.exports = db;
  • MVCモードでモデルを作成し、DB連動をサポートします.例自己紹介DBのindexpostを管理する.jsファイルとそのモデルのapiコントローラを使用します.jsを持ってきました.
  • indexpost.js (Model)
    const db = require('../lib/db');
    const sanitizeHtml = require('sanitize-html');
    const asyncHandler = require('express-async-handler');
    
    let Post = function(post){
        this.id = post.id
        this.title = post.title;
        this.content = post.content;
        this.image_src = image_src;
    }
    
    // index 설명페이지 데이터 전부 가져옴.
    Post.aboutmeAll = function(){
        // async 처리위해 Promise 사용
        return new Promise((resolve, reject) => {
            db.query("SELECT * FROM aboutme", function(err, result, fields){
                if (err) throw err;
                else {
                    resolve(result);
                }
            })
        }).catch(error => console.log(error));
    }
    ...
    apiController.js (Controller)
    const indexmodel = require('../model/indexpost');
    
    ////////////////////////////// aboutme API ////////////////////////////////////////////////////////////
    // @ get
    // /api/aboutme
    const getAboutme = async(req, res) => {
        var result = {};
        result = await indexmodel.aboutmeAll(); // 전체 aboutme table data 소환
        res.json(result);
    };
    ...
  • DBでは、すべての関数がasync、すなわち非同期処理されている.Node.jsの場合、非同期処理を行わないと同期処理が行われます.つまり、DBでは、クエリが完了していなくても結果値が受信されない場合がほとんどであり、次の実行する関数でも結果値が受信された(エラー)と判断して操作される.筆者は最初は非同期処理の知識もなく,問題が発生した(データベースクエリの結果値が受け入れられず,長い間悩んでいた).非同期処理の内容を理解しました.
    したがって、Promise-resolution/async-awaitとして作成されます.次のように動作します.
  • 1-Controllerは、非同期処理として指定された関数であるasyncを呼び出す.(getAboutme関数)
    2-関数でPromiseオブジェクトを返す非同期関数を呼び出します.このとき、前にwaitを追加して、非同期関数が終了を待つようにします.
    3モデルの関数が呼び出されます.(Post.aboutmeAll関数)Promiseオブジェクトを返す匿名関数内で、非同期処理が正常に完了した場合、結果オブジェクトを返す必要があります.これは明示的な決心だ.(resolve(result))
    4-Promiseオブジェクトが返されると、getAboutme関数の残りの部分が操作されます.
  • ビットの非同期処理を行い、DBを利用することができる.