Node.jsとMongoDBを使ったログイン機能の実装をMacのlocalhostで試す

# Node.jsとMongoDBを使ったログイン機能の実装をMacのlocalhostで試す
Webサービスを作りたいので、ログイン機能をlocalhostで試します。  
MongoDBとNode.jsを使います。  
Node.jsのインストールの説明は割愛。

## MongoDBのインストールから起動まで

インストールの前処理

```
brew tap mongodb/brew
```

インストール

```
brew install mongodb-community
```
保存場所作成

```
sudo mkdir /var/lib/mongodb
```

ログ作成

```
sudo touch /var/log/mongodb.log
```

起動

```
sudo mongod --dbpath /var/lib/mongodb --logpath /var/log/mongodb.log
```

## ログイン機能の実装
まず、モジュールをインストールしておきます。
`npm install express`
`npm install monogodb`
下記のコードで sign up と login が出来ると思います。

```server.js
const express = require('express');
const app = express();
const bodyParser = require('body-parser');
const MongoClient = require('mongodb').MongoClient;
const http = require('http').Server(app);

const url = 'mongodb://localhost:27017';
const dbName = 'myMongo';
const connectOption = {
    useNewUrlParser: true,
    useUnifiedTopology: true,
}

const transactionKururiDownload = async (data, res) => {
  let client;
  let login = false;
  try {
    client = await MongoClient.connect(url, connectOption);
    const db = client.db(dbName);
    const collection = db.collection('account');
      await collection.find({}).toArray( (err, docs) => {
        for (const doc of docs) {
          if (doc.mail == data.mail) {
            if (doc.password == data.password) {
              login = true;
              res.sendFile(__dirname + "/index.html");
            }
          }
        }
        if (!login) {
          res.send("login error");
        }
      });
  } catch (error) {
    console.log(error);
  } finally {
//    client.close();
  }
};

const transactionKururiInsert = async (data, res) => {
  let client;
  data = Object.assign(data, {date: new Date() });
  try {
    client = await MongoClient.connect(url, connectOption);
    const db = client.db(dbName);
    const collection = db.collection('account');
    const a = await collection.updateOne({mail:data.mail, password:data.password, name:data.name, date:data.date}, {$set:data}, true );
    if (a.result.n == 0) {
      await collection.insertOne(data);
    }
  } catch (error) {
    console.log(error);
  } finally {
    client.close();
  }
};



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

app.get('/', (req, res) => {
  res.sendFile(__dirname + "/login.html");
});
app.get('/signup', (req, res) => {
  res.sendFile(__dirname + "/signup.html");
});

app.post('/signup', async (req, res) => {
  let client;
  let exist = false;
  try {
    client = await MongoClient.connect(url, connectOption);
    const db = client.db(dbName);
    const collection = db.collection('account');
      await collection.find({}).toArray( (err, docs) => {
        console.log(docs);
        for (const doc of docs) {
          if (doc.mail == req.body.mail){
            console.log(req.body.mail);
            exist = true;
          }
        }

        let user = {mail:"", name:"", password:""};

        if (!exist && req.body.mail != "" && req.body.password != "") {
          user["mail"] = req.body.mail;
          user["password"] = req.body.password;
          user["name"] = user.mail.substr(0, user.mail.indexOf("@"));
          transactionKururiInsert(user, res);
      
          res.sendFile(__dirname + "/signuped.html");
        } else {
          res.sendFile(__dirname + "/signuperror.html");
        }
      });
  } catch (error) {
    console.log(error);
  } finally {
//    client.close();
  }
});


app.post('/', (req, res) => {

  let user = {
    mail:"", name:"", password:""
  };

  user["mail"] = req.body.mail;
  user["password"] = req.body.password;
  user["name"] = user.mail.substr(0, user.mail.indexOf("@"));
  transactionKururiDownload(user, res);

});

http.listen(8080, () => {
  console.log('listening on :8080');
});

```

```login.html
<html>
<head>
    <title>login</title>
</head>
<body style="width: 100%; display: flex; flex-direction: column; justify-content: center; align-items: center;">
    <form action="" method="post">
        <h1>login</h1>
        <table>
            <tr>
                <td>mail</td>
                <td><input id="mail" name="mail" type="mail" /></td>
            </tr>
            <tr>
                <td>password</td>
                <td><input id="password" name="password" type="password" /></td>
            </tr>
        </table>
        <button>send</button>
    </form>
    <br>
    <a href="signup">sign up</a>
</body>
</html>

```

```signup.html
<html>
<head>
    <title>signup</title>
</head>
<body style="width: 100%; display: flex; flex-direction: column; justify-content: center; align-items: center;">
    <form action="" method="post">
        <h1>signup</h1>
        <table>
            <tr>
                <td>mail</td>
                <td><input id="mail" name="mail" type="mail" /></td>
            </tr>
            <tr>
                <td>password</td>
                <td><input id="password" name="password" type="password" /></td>
            </tr>
        </table>
        <button>send</button>
    </form>
</body>
</html>
```

```signuped.html
<!Doctype html>
<html>
  <head>
    <title>logined</title>
  </head>
  <body style="width: 100%; display: flex; flex-direction: column; justify-content: center; align-items: center;">
    <h1>Success signup!</h1>
    <a href="/">please login</a>
  </body>
</html>
```

```signuperror.html
<!Doctype html>
<html>
  <head>
    <title>error</title>
  </head>
  <body style="width: 100%; display: flex; flex-direction: column; justify-content: center; align-items: center;">
    <h1>signup error</h1>
  </body>
</html>
```

```index.html
<!DOCTYPE html>
<html>
    <head>
        <title>test</title>
    </head>
    <body>
        login success!
    </body>
</html>
```