LoginSignup
1
4

More than 3 years have passed since last update.

Node チュートリアル - 開発環境構築

Last updated at Posted at 2019-09-05

Node, express, mongoDbを勉強したかったので、Dockerで開発環境を作ってみた。

ディレクトリ構造

docker-compose.yml
docker-configs/lerning-node/Dockerfile
docker-configs/mongo/mongod.conf
docker-configs/mongo/Dockerfile
apps/Learning_Node/package.json
apps/Learning_Node/app.js

docker-compose.yml

version: '2'
services:
  nginx-proxy:
    image: jwilder/nginx-proxy
    volumes:
      - /var/run/docker.sock:/tmp/docker.sock:ro
    ports:
      - '80:80'
      - '443:443'

  mongo:
    build: ./docker-configs/mongo
    restart: always
    ports:
      - "27017:27017"
    volumes:
      - ./data/mongodb/db:/data/db
    environment:
      MONGO_INITDB_ROOT_USERNAME: root
      MONGO_INITDB_ROOT_PASSWORD: admin

  learning-node:
    build: docker-configs/learning-node
    volumes:
      - ./apps/Learning_Node:/var/www/html
    depends_on:
      - mongo
    environment:
      - VIRTUAL_HOST=learning-node.local.host
      - COLUMNS=200

docker-configs/learning-node/Dockerfile

FROM node:10.16.3

WORKDIR /var/www/html
EXPOSE 80
CMD [ "npm", "start" ]

docker-configs/mongo/Dockerfile

FROM mongo:4.2.0

COPY ./mongod.conf /etc/mongod.conf

docker-configs/mongo/mongod.conf

security:
    authorization: enabled

package.json

{
  "name": "learning-node",
  "version": "1.0.0",
  "description": "For learning Node Js.",
  "author": "Shintaro Nitta",
  "license": "MIT",
  "main": "app.js",
  "keywords": [
    "nodejs",
    "bootstrap",
    "express"
  ],
  "dependencies": {
    "express": "^4.16.4"
  },
  "scripts": {
    "start": "node app.js"
  }
}

Install Node Js

nodebrew install v10.16.3
nodebrew use v10.16.3
node --version

npm install, run docker-compose

cd apps/Learning_Node
npm install
cd ../
docker-compose up -d

Add a host to /etc/hosts, access the host

127.0.0.1 learning-node.local.host

app.js

const express = require('express');
const { config, engine } = require('express-edge');
const router = express.Router();
const mongoose = require('mongoose');
const bodyParser = require('body-parser');
require('date-utils');

const viewFolder   = __dirname + '/views/';
const documentRoot = __dirname + '/public/';
const port         = 80;
const app          = new express();
const Post         = require('./database/models/Post');

// Initialize Middlewares.
mongoose.connect('mongodb://node-blog:password@mongo:27017/node-blog', { useNewUrlParser: true, auth:{authdb: "node-blog"}})
    .then(() => 'You are now connected to Mongo!')
    .catch(err => console.error('Something went wrong', err))
app.use(express.static('public'));
app.use(engine);
app.set('views', viewFolder);
app.use(bodyParser.json())

app.use(bodyParser.urlencoded({
    extended: true
}));

// Configure Edge if need to.
config({ cache: process.env.NODE_ENV === 'production' });

// Load middleware function that will log requests.
router.use(function (req, res, next) {
    let date = new Date();
    console.log('Time:', date.toFormat("YYYY/MM/DD HH24:MI:SS"));
    // Take over to a router.
    next();
});

router.get('/', (req, res) => {
    res.render('index');
});

router.get('/about', (req, res) => {
    res.render('about');
});

router.get('/contact', (req, res) => {
    res.render('contact');
});

router.get('/post', (req, res) => {
    res.render('post');
});

router.get('/posts/new', (req, res) => {
    res.render('create');
});

app.post('/posts/store', (req, res) => {
    console.log(req.body);
    Post.create(req.body, (error, post) => {
        console.log(error, post);
        res.redirect('/posts/new');
    });
});

app.use(express.static(documentRoot));
app.use('/', router);
app.listen(port, function () {
    console.log('Example app listening on port 80!')
});

Run docker-compose & create mongodb user

docker-compose up -d
docker exec -it <mongo_container_name> bash

# mongo -u root
MongoDB shell version v4.2.0
Enter password:

> use node-blog
> db.grantRolesToUser('node-blog', [{role: 'readWrite', db: 'node-blog'}])
> db.grantRolesToUser('node-blog', [{role: 'dbAdmin', db: 'node-blog'}])

Note: Basically readWrite provides CRUD, dbAdmin provides database management ability.

1
4
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
4