switch編-nodejsからmongodbの操作を少しづつ改良してみる

公開日:2018-11-30
最終更新:2018-12-01
  • 前記事でmongodbの操作をnodejsから操作できるようになりましたが、あのままでは必要な処理を毎回main処理に放り込むか、コメントアウトをする必要があります。
  • これを少し改良して、番号でコレクションメソッドを呼び出すスイッチ方式に変えたいと思います。
  • 例えば、10番は削除、20番は作成, 30番は一覧表示などです。 少し便利になりそうです
  • 切り替える操作なので、swich文を使えば実装出来そうです。

  • イメージ的には、こんな感じです。

let x = 10

 switch (x) {
  case 10:
  削除処理関数
  break
  case 20:
  作成処理関数
  break
  case 30:
  一覧表示関数
  break
  ...
  ...
  ...
}
  • 合体させる前に、メインコードを少し整理したいと思います。
  • そして、今回はコールバック処理の方をカスタマイズしていきたいと思います。
  • なぜこちらを採用したかといいますと、async処理では実装に注意する点が今回多いので諦めました。

  • async処理では、awaitと親子関係を維持する必要がありますので、これが壊れる可能性がたかい場合はやりにくいのです。

async関数
  await 関数
  await 関数
  await コールバックがある関数(おすすめしないがエラーにならない)
    コールバック処理
      コールバック処理
  await 関数
  コールバックがある関数
    await コールバック処理 --> エラーになる
  • レガシーな命令を使うことがわかっている場合は、素直にコールバックで実装したほうが良さそうです。

  • ということで、前回のコールバック処理系を用意します。

  • コレクションメソッド関数群は、邪魔になってきたので別ファイルに移動しておきました。

  • myAppCallback.js

const MongoClient = require('mongodb').MongoClient
const assert = require('assert')

const url = 'mongodb://localhost:27017/myproject'
const dbName = 'myproject'
const client = new MongoClient(url)
const lib = require('./libCallback.js')
const { insertDocuments, insertOneDocument, findDocuments, deleteManyDocuments } = lib




client.connect(err => {
    assert.equal(null, err)
    console.log("Connected successfully to server")
    const db = client.db(dbName)

    deleteManyDocuments(db, () => {
        insertDocuments(db, () => {
            findDocuments(db, (docs) => {
                console.log(docs)
                client.close()
            })
        })
    })
})
  • libCallback.js

const assert = require('assert')

module.exports.updateOneDocument = (db, callback) => {
    const collection = db.collection('documents')
    collection.updateOne(
        { a: 1 },
        { $set: { a: 100 }}, (err, result) => {
            assert.equal(err, null)
            console.log("update the records")
            callback(result)
        })
}

module.exports.deleteManyDocuments = (db, callback) => {
    const collection = db.collection('documents')
    collection.deleteMany({}, (err, result) => {
        assert.equal(err, null)
        console.log("Delete All")
        callback(result)
    })
}

module.exports.findDocuments = (db, callback) => {
    const collection = db.collection('documents')
    collection
        .find({})
        .project({ '_id': 0})
        .toArray((err, docs) => {
            assert.equal(err, null)
            console.log("Founds the records")
            callback(docs)
        })
}

module.exports.insertDocuments = (db, callback) => {
    const collection = db.collection('documents')
    collection.insertMany([
        { a: 1 },
        { a: 2 },
        { a: 3 },
    ], (err, result) => {
        assert.equal(err, null)
        assert.equal(3, result.result.n)
        assert.equal(3, result.ops.length)
        console.log("Insered  documents")
        callback(result)
    })
}
  • 上記コードにスイッチ文を追加してみます

  • myAppCallback.js


const MongoClient = require('mongodb').MongoClient
const assert = require('assert')

const url = 'mongodb://localhost:27017/myproject'
const dbName = 'myproject'
const client = new MongoClient(url)
const lib = require('./libCallback.js')
const { insertDocuments, insertOneDocument, findDocuments, deleteManyDocuments } = lib

let x = 10



client.connect(err => {
    assert.equal(null, err)
    console.log("Connected successfully to server")
    const db = client.db(dbName)

    switch(x) {
        case 10:
            deleteManyDocuments(db, (result) => {
                console.log(result.result)
            })
            client.close()
            break
        case 20:
            insertDocuments(db, (result) => {
                console.log(result)
            })
            client.close()
            break
        case 30:
            findDocuments(db, (docs)=> {
                console.log(docs)
            })
            client.close()
            break
    }
})
  • x の値を変更すれば、削除、作成、表示ができるようになりました。
  • case 文をふやしていけば、いろんなコレクションメソッドを追加していけます。
  • 使っていけば判りますが、できれば x の値の変更をコードの外で変更できる方が便利であることが判ります。
  • 少しNodejsの標準入力で調べたのですがただ10, 20, 30と入力したいだけなのに意外と面倒であることがわかりました。

  • 同じ面倒であるならば、もう少し応用できそうな方法で実装したいと思い、ブラウザーのURL欄を入力スイッチにしたいと思います。

    • ブラウザーのURL入力欄に、10, 20, 30 と切り替える数字を入れることでコレクションメソッドを変更できるように実装します。
    • Nodejsは、本来サーバー側で使うプログラムなので、webクライアントであるブラウザーとのやりとりするwebサーバー命令が標準で用意されているのでそれを使って行きたいと思います。
  • 今回使うのは、標準で用意されている http です。

  • myHttp.js
const http = require('http')
const server = http.createServer()
let msg = ''

server.on('request', (req, res) => {
    switch(req.url) {
        case '/10'    :
            msg = 'delete Done'
            break
        case '/20':
            msg = 'add Done'
            break
        case '/30':
            msg = 'find Done'
            break

        default:
            msg = req.url + "is wrong page"
            break
    }
    res.writeHead(200, {'Content-Type': 'text/plain'})
    res.write(msg)
    res.end()
})

server.listen(1337, 'localhost');
console.log("server listening... ctrl + c --> end");
  • これを実行してみます。
node myHttp.js
  • ブラウザーのURL入力欄に数字を付けてエンターしてみます
  • http://localhost:1337/10
  • http://localhost:1337/20
  • http://localhost:1337/30

  • 各々Doneメッセージが出ていれば、これを使ってスイッチの入力代わりに使えそうです。

  • 以前に説明したasyncは、http を使うとコールバック内でswitch文を使うことになるので、async命令と相性が悪いのです。

  • 実装してみます

const MongoClient = require('mongodb').MongoClient
const assert = require('assert')
const http = require('http');
const server = http.createServer()

const url = 'mongodb://localhost:27017/myproject'
const dbName = 'myproject'
const client = new MongoClient(url)
const lib = require('./libCallback.js')
const { insertDocuments, insertOneDocument, findDocuments, deleteManyDocuments } = lib


client.connect(err => {
    assert.equal(null, err)
    console.log("Connected successfully to server")
    const db = client.db(dbName)
    let msg = ''

    server.on('request', (req, res) => {

        switch(req.url) {
            case'/10':
                deleteManyDocuments(db, (result) => {
                    console.log(result.result)
                })
                msg = 'delet done'
                break
            case'/20':
                insertDocuments(db, (result) => {
                    console.log(result)
                })
                msg = 'insert done'
                break
            case'/30':
                findDocuments(db, (docs)=> {
                    console.log(docs)
                })
                msg = 'find done'
                break

        }

        res.writeHead(200, {'Content-Type': 'text/plain'})
        res.write(msg)
        res.end()
    })
    server.listen(1337, 'localhost');
    console.log("server listening...");

})
  • ブラウザーから、前回と同じように数字を入れてみてください。
  • 各々done表示がでていれば、データベースにも値が反映されているはずです。
  • mongo shell で確認してみるのもいいかもしれません。

  • これでだいぶ改善されたと思うのですが、ブラウザーの入力欄への記入をhtmlからできるとクリックするだけで切り替えできそうです。

  • index.html
<DOCTYPE html>
<html>
  <head>
    <title>mongodb switcher</title>
  </head>
  <body>
    <h1>mongodb コレクションメソッドコントロール</h1>
    <p><a href="http://localhost:1337/10">削除</a></p>
    <p><a href="http://localhost:1337/20">作成</a></p>
    <p><a href="http://localhost:1337/30">表示</a></p>
  </body>
</html>
  • css処理もしていないので、ほんと貧相ですみません。m(__)m
  • 自分で使うだけなので、良しとしてください。
  • 実行してみます
open index.html
node myAppCallback
  • クリックしたら、再度実行するのにいちいちブラウザーバックしないと行けないのはいただけないですが、とりあえずURL欄に入力するよりこちらのほうが便利でしょう。
  • コレクション命令を増やせばここでコントロールできそうです。

  • 今回はここまでで終了です。

  • 次回も、またもう少し改善していきたいと思います。
記事が少しでもいいなと思ったらクラップを送ってみよう!
18
+1
@atoris1192の技術ブログ

よく一緒に読まれている記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう
目次をみる

技術ブログをはじめよう

Qrunch(クランチ)は、ITエンジニアリングに携わる全ての人のための技術ブログプラットフォームです。

技術ブログを開設する

Qrunchでアウトプットをはじめよう

Qrunch(クランチ)は、ITエンジニアリングに携わる全ての人のための技術ブログプラットフォームです。

Markdownで書ける

ログ機能でアウトプットを加速

デザインのカスタマイズが可能

技術ブログ開設

ここから先はアカウント(ブログ)開設が必要です

英数字4文字以上
.qrunch.io
英数字6文字以上
ログインする