やりたいこと
DockerでNodeのコンテナを作成し、MongoDBのコンテナにアクセスしたい。しかし、接続ができない(認証が失敗する)ときがあるので、方法として3種類紹介したいと思います。
Node.js初心者なので書き方がよくなかったり、こんな方法使わんだろと思うかもしれません。ぜひ教えていただきたいです。
実装について
node: Node.jsのコンテナでMongoDBのコンテナにアクセスしていろいろしたい
mongodb: mongoのコンテナでデータベースサーバ
一応、docker-composeファイルを載せておきます。
version: "3.8"
services:
mongodb:
container_name: "mongodb"
hostname: "mongodb"
image: mongo:5.0.5
restart: always
ports:
- 27017:27017
volumes:
- ./mongodb_db:/data/db
- ./mongodb_configdb:/data/configdb
environment:
MONGO_INITDB_ROOT_USERNAME: root
MONGO_INITDB_ROOT_PASSWORD: password
node:
container_name: "node"
hostname: "node"
image: node:17.3
tty: true
restart: always
ports:
- 3000:3000
volumes:
- ./node_src:/src
working_dir: "/src/"
認証方法について
1つ目の方法
uriに、ログインするユーザとそのパスワードを載せて、接続する時に認証する方法。
Dockerを使わず、ローカルで実行するとき(localhostのデータベースに接続するとき)、以下の方法で接続できます。
const MongoClient = require('mongodb').MongoClient;
const uri = "mongodb://root:password@localhost:27017";
.....
MongoClient.connect(uri, (err, client) => {
.....
collection.find(query).toArray((err, result) => {
.....
}
}
2つ目の方法
uriに、ログインするユーザとそのパスワードを載せて、インスタンスを作成する際に認証する方法。
私がみたinsertOne()
の公式のサンプルコードではこの方法が使われていました。
import { MongoClient } from "mongodb";
const uri = "mongodb://root:password@mongodb:27017";
const client = new MongoClient(uri);
.....
await client.connect();
const database = client.db("insertDB");
const haiku = database.collection("haiku");
const result = await haiku.insertOne(doc);
.....
3つ目の方法
optionsにログインするユーザとパスワードを入れて、接続する時に認証する方法。
optionsについて詳しく知りたい人はこちらへ
const uri = "mongodb://mongodb:27017",
const options = {
useNewUrlParser: true,
useUnifiedTopology: true,
auth: {
username: "root",
password: "password"
}
}
.....
MongoClient.connect(uri, options, (err, client) => {
.....
collection.find(query).toArray((err, result) => {
.....
}
}
さいごに
方法は3つだけでなく、他にもあると思います。
認証方法がたくさんあって難しい。。。