Quantcast
Channel: Node.jsタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 9025

初心者にMongoDBを教えようと自作パッケージを作って奮闘した話

$
0
0

ごあいさつ

初投稿です。よろしくお願いします。
駒場祭という学園祭でプログラミングをしたりしてました。基本的にNode.jsを使っています。

注意

この記事はあくまでやったことの紹介であり、解決策は提示していません。

この記事は......

駒場祭委員会にはシステム局というIT分野を担当する部署があり、ウェブサイトや、参加される企画の登録をしたり、申請や情報を集めたりするウェブシステムと呼ばれるシステムなどを例年作っています。
無給のブラック学生自治団体であるため、経験者は余り集まらず、キャンパスが変わるため2年生までしか参加しません。
よって初心者の1年生に2年生が引退するまでの半年間で様々な知識を教え込むことになります。

駒場祭のウェブサイトには(現在はもう使えませんが)当日に公式グッズの売り上げやキャンパスツアー企画の参加賞配布状況
が分かるページもあり、開発ではフロントエンド(見た目の部分)だけでなく、サーバーで動くバックエンドも重要になっています。

この記事では特にバックエンドに関して、初心者に伝えようとした僕の奮闘の記録です。
一番悩んで工夫したつもりになっているMongoDBに関して特に扱います。

技術的にも内容的にも面白くは無いと思いますが、学園祭プログラマーの方や、「非IT企業でIT部門のメンバーがコロコロ変わってしまい技術引き継ぎが難しい...」などといった悩みをお抱えの方に役立てばと思います。

そもそも何が難しいのか

バックエンドとは何か

初心者にとって「フロントエンド」「バックエンド」という言葉は余り聞き慣れないものでしょう。
「みんなの使ってるブラウザがフロントエンドだよ。バックエンドってのはサーバーで動いてるもので、例えばログインデータはサーバーにないと改竄されちゃうよね。」
的な感じで説明しました。

DBについて

「データベースってものが色々あってデータを同時に読み書きしたり、検索したりするのに便利だから使うんだ。駒場祭で使うデータはサーバーに入れておくんだ。」
といった感じで説明しました。僕自身1年前にデータベースについて聞いた際に必要性がわからなかったので(当時の僕「え?jsonファイルで保存すればいいじゃんw」)、何が便利なのかを説明しました。またMySQL?DB?ってなっていたので、データベースの種類としてMySQLや今回扱うMongoDBがあるということも説明しました。

MongoDBのわかりにくさ

MongoDBをNode.jsで扱う際、基本的にはmongodbという公式のパッケージを使います。
mongooseなどのパッケージもありますが、さらに複雑になるため初心者向けではないということで以下では無視します。)
これは扱うのがなかなか面倒で、データを持ってくるために

constmongodb=require('mongodb');constMongoClient=mongodb.MongoClient;constclient=awaitMongoClient.connect('mongodb://127.0.0.1:27017/',{useUnifiedTopology:true,useNewUrlParser:true,});constdb=awaitclient.db('dbName');constcollection=db.collection('collectionName');constdata=awaitcollection.find().toArray();client.close();

と書く必要があります。

これはawaitを使っているのでまだマシですが、async/awaitを封印するとより複雑になってしまいます。
よってasync/awaitなしで教えるのは難しく、とりあえずasync/awaitを教えて.......となってしまいます。非同期を教えた話は長くなるので省略します。

もう1つ、「接続して、dbを選択して、collectionを選択して、......」となると複雑であり、「そもそもDBってなんや」ってなってた人は混乱しちゃいます。

さらにMongoDBについて学ぼうとすると、Node.js以外の話なども出てきて「Node.js」があまりわかってない初心者には「ggってもよくわからない......」となってしまいます。

どうすればいいのでしょうか......?

自作パッケージで解決だ!

さて上記の問題を解決しないといつまでたっても1年生がDBを使いこなせません。そこで「ggるのが難しいならggれなくていいじゃないか!」「とりあえず単純にして慣れてもらおう!」ということでパッケージを作ってしまいました。

それがmongodbeginnerGitHub)です。
基本的に内部で教える際に使うために作ったので色々と雑で実用に耐えるものかは怪しいです。

使い方

mongodbeginnerでは初心者が とりあえず DBを使えるように工夫した結果、接続などの処理を毎回行います。
例えば id1のデータをfindしたい際には

mongodbeginnerのサンプル
constmob=require('mongodbeginner')constdata=awaitmob.find("dbName","collectionName",{id:1})

とすればOkです。
接続して......ってのが複雑なのが解決したのではないでしょうか?
もし {id: 1, count: 0}というデータをinsertしたい場合は

mongodbeginnerのサンプル2
constmob=require('mongodbeginner')constdata=awaitmob.insert("dbName","collectionName",{id:1,count:0})

などとします。

接続して...ってとこが複雑すぎるという問題は解決したのではないでしょうか?

問題点

これをやったのが8月なのですでに直したいところも多々ありますが、そもそもの実力不足もありなんとも言えない出来になってしまいました。
というかもし自信があったら制作時点でQiitaにドヤ顔で紹介記事を書いていました。

最大の問題は結局awaitが必要になってしまうことでしょう。
これの解決策は特に思いついてなく、結局やはりPromiseやasync/awaitを初心者にも覚えてもらうしかないのでしょうか......?。

超簡易版 npmにパッケージを公開する方法

なかなかnpmにパッケージを公開するのは思った以上に簡単でした。特にこちらの記事を参考にしました。

内部向けパッケージだったのでテストもなく簡単でした。せっかくなのでいつものNode.jsアプリケーションの開発と違う部分をメモしておきます。

npmへのuser登録
$ npm set init.author.name "名前"$ npm set init.author.email "メールアドレス"$ npm set init.author.url "URL"$ npm adduser
初回公開
$ git tag -a v1.0.0 -m"My first version v1.0.0"$ git push origin tags/v1.0.0
$ npm publish ./
パッチアップデート(修正)
$ npm version patch
$ git push origin tags/v1.0.1  # ここは手動でやるしかない$ npm publish ./
マイナーアップデート
$ npm version minor
$ git push origin tags/v1.1.0  # ここは手動でやるしかない$ npm publish ./
メジャーアップデート
$ npm version major
$ git push origin tags/v2.0.0  # ここは手動でやるしかない$ npm publish ./

まとめ

とりあえずMongoDBを1年生に慣れてもらうためにいろいろとやろうとしました。
ただ結果としては初心者にはやはり理解し難かったのかと思います。

また自分の経験からDBを難しいものとばかり考えて、駒場祭で使用したWebアプリケーション・フレームワークのExpress.jsの解説を軽視してしまった結果、そっちで詰まっていた様子も感じたので、やはり初心者にバックエンドプログラミングを教えるというのは難しいものでした。

......ruby on railsでもやろうかなぁ。時代遅れって聞くこともあるけど...


Viewing all articles
Browse latest Browse all 9025

Trending Articles