LoginSignup
1
1

More than 1 year has passed since last update.

MongoDBにNode.jsで接続するときの認証について

Posted at

やりたいこと

DockerでNodeのコンテナを作成し、MongoDBのコンテナにアクセスしたい。しかし、接続ができない(認証が失敗する)ときがあるので、方法として3種類紹介したいと思います。
Node.js初心者なので書き方がよくなかったり、こんな方法使わんだろと思うかもしれません。ぜひ教えていただきたいです。

実装について

node: Node.jsのコンテナでMongoDBのコンテナにアクセスしていろいろしたい
mongodb: mongoのコンテナでデータベースサーバ

一応、docker-composeファイルを載せておきます。

docker-compose.yml
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のデータベースに接続するとき)、以下の方法で接続できます。

find_data.js
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()公式のサンプルコードではこの方法が使われていました。

/src/insert_data.js
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について詳しく知りたい人はこちらへ

/src/find_data.js
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つだけでなく、他にもあると思います。
認証方法がたくさんあって難しい。。。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1