Part 3 - Setup project with nodejs, expressjs và connect mongodb

Nội dung bài viết

Video học lập trình mỗi ngày

Sau khi ở part 2, devjs cũng đã hiểu vì sao chúng ta lại chọn buil a project with nodejs, expressjs, mongodb rồi. Và để tiếp tục Series này thì ở phần 3 này, chúng ta sẽ setup một project theo một quy chuẩn và rất phổ biến.

Yêu cầu làm được phần 3:

  • - Hiểu về nodejs, expressjs, mongodb
  • - Đã install được node, và mongodb
  • - Đọc những bài viết trước về Series.

Series build a project

Đề tài: Build một blog + chat sử dụng nodejs, expressjs, mongodb, firebase

Part 1 - Vì sao mỗi developer nên có một blog

Part 2 - Vì sao lại phát triển web application sử dụng nodejs và expressjs?

Part 3 - Setup project with nodejs, expressjs và connect mongodb

Part 4: Tạo chức năng login và register sử dụng nodejs, expressjs, mongodb

Kiến trúc dự án

Dưới đây là kiến trúc của một dự án, mà rất nhiều blogger và trên github  khuyến khích, các bạn có thể xem hình ảnh dưới đây.

Kiến trúc dự án nodejs

Các bạn có thể tạo như trên or tôi sẽ đưa lên github cho các bạn. Ở phần này quan trọng là các bạn có thể connect được với mongodb với localhost là xong.

Create Node.js App

$ mkdir build_project_anonystick
$ cd build_project_anonystick

Tiếp theo khởi tạo Node.js App với file package.json:

$ npm init -y

{
  "name": "build_project_anonystick",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}

Next, chúng ta tiếp tục install những package cần thiết như :

$ npm install express mongoose body-parser cors morgan ejs --save

Sau khi các bước trên hoàn thành thì file package.json như thế này.

{
  "name": "build_project_anonystick",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "body-parser": "^1.19.0",
    "cors": "^2.8.5",
    "ejs": "^3.0.2",
    "express": "^4.17.1",
    "mongoose": "^5.9.9",
    "morgan": "^1.10.0"
  }
}

Notes: npm init -y khác với npm init là nó bỏ qua những bước của init thôi, chứ có có magic gì ở đây.

Setup Express web server

Trong root folder chúng ta tạo file index.js

#create file index.js

const express = require("express");
const bodyParser = require("body-parser");
const cors = require("cors");
const morgan = require('morgan')
const mongoose = require('mongoose')
const _CONST = require('./app/config/constant')
const DB_MONGO = require('./app/config/db.config')
const app = express();

var corsOptions = {
  origin: "http://localhost:8081" // co thể sau này nó là resfult api, cứ để sẵn
}
app.use(morgan('combined')) //theo dõi log GET, POST...

app.use(cors(corsOptions)); //cross domain...

app.use(express.static('public', {'extensions': ['jsx']} ));
app.set('view engine', 'ejs');


// parse requests of content-type - application/json
app.use(bodyParser.json());

// parse requests of content-type - application/x-www-form-urlencoded
app.use(bodyParser.urlencoded({ extended: true }));

connect(); //Connect to Mongodb
function isOkay(){
	console.log('connect to mongodb is OKay');// check mongodb có kết nối thành công hay không
}

function connect() {
	mongoose.connection
	  .on('error', console.log)
	  .on('disconnected', connect)
	  .once('open', isOkay);
	return mongoose.connect(DB_MONGO.url, { keepAlive: 1, useNewUrlParser: true });
}

require('./app/routes/')(app); //importing route

const PORT = process.env.PORT || _CONST.PORT;
app.listen(PORT, () => {
  console.log(`Server is running on port ${PORT}.`);
});

Trong đó, file db.config.js 

/app/config/db.config.js

module.exports = {
    url: "mongodb://admin:Anonystick@127.0.0.1:27017/anonystick"
}

file routes/index.js 

/app/routes/

'use strict';
const index_Controller = require('../controllers/')

module.exports = function(app) {
    app.route('/api/test').get(index_Controller.test); 
    app.route('/').get(index_Controller.home); 
    
}

Notes: Riêng về phần install mongodb thì các bạn có thể đọc ở đây. Hướng dẫn install Mongodb Và middleware morgan là gì? Thì đọc bài viết này, và xem trong này mình cần những middleware nào nữa không? 3 middleware hữu ích khi sử dụng express rest api

Connect mongodb với localhost

Nếu bạn nào đang sử dụng MacOS thì các bạn có thể làm theo hướng dẫn nhanh dưới đây:

Đầu tiên run :

$ brew install mongodb

Nếu có lỗi Error: No available formula with the name "mongodb". Thì chạy lệnh này;

$ brew tap mongodb/brew

Tiếp, install phiên bản mới nhất là 4.2

$ brew services start mongodb-community@4.2

Sau khi thành công thì, thử insert một item xem sao, sau đó set quyền cho mongodb Có thể xem chi tiết ở đây:  Mongodb create database and user terminal

$ mongo

> db
test
> 
> 
> 
> use anonystick
switched to db anonystick
> db.test.insertOne({name: 'anonystick'})
{
	"acknowledged" : true,
	"insertedId" : ObjectId("5e992b9f67b97546868a8b7e")
}

> 
> 
> db.test.find()
{ "_id" : ObjectId("5e992b9f67b97546868a8b7e"), "name" : "anonystick" }

> db.createUser( 
...   {
...     user: "admin",
...     pwd: "Anonystick",
...     roles: [ { role: "readWrite", db: "anonystick" } ]
...   }
... )

> exit

Sau khi chạy thành công thì thử connect localhost bằng câu lệnh sau:

$ mongo "mongodb://admin:Anonystick@127.0.0.1:27017/anonystick"

Nếu thành công thì nó sẽ xuất hiện:

MongoDB shell version v4.2.5
connecting to: mongodb://127.0.0.1:27017/anonystick?compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("769da42a-852a-4823-b6e6-dc5faa69b301") }
MongoDB server version: 4.2.5

Ngược lại là sai như thế này:

MongoDB shell version v4.2.5
connecting to: mongodb://127.0.0.1:27017/anonystick?compressors=disabled&gssapiServiceName=mongodb
2020-04-17T11:29:10.924+0700 E  QUERY    [js] Error: Authentication failed. :
connect@src/mongo/shell/mongo.js:341:17
@(connect):2:6
2020-04-17T11:29:10.928+0700 F  -        [main] exception: connect failed
2020-04-17T11:29:10.928+0700 E  -        [main] exiting with code 1

Fix connect mongodb localhost.

Nói về lỗi connect localhost này thì nhiều lỗi, nhưng chúng ta dựa vào file log của mongodb để check mà thôi

$ cat /usr/local/var/log/mongodb/mongo.log

Ở đó, chúng ta sẽ biết lỗi ở đó, ví dụ tôi sẽ nhập sai pass thì nó sẽ báo thế này.

2020-04-17T11:22:23.594+0700 I  ACCESS   [conn128] SASL SCRAM-SHA-1 authentication failed for anonystick on admin from client 127.0.0.1:50165 ; UserNotFound: Could not find user "anonystick" for db "admin"
2020-04-17T11:22:23.594+0700 I  NETWORK  [conn128] end connection 127.0.0.1:50165 (1 connection now open)
2020-04-17T11:22:24.099+0700 I  NETWORK  [listener] connection accepted from 127.0.0.1:50166 #129 (2 connections now open)

Start nodejs chạy localhost:8080

Sau khi hoàn tất và install như trên ta thử run node, bằng cách.

$ node index.js

Thử chạy trên trình duyệt : http://localhost:8080  ta sẽ thấy như hình ảnh sau:

Tạo form login, register cho quản trị viên

Vì thời gian cũng có hạn, và công việc của tôi cũng nhiều, chính vì thế tôi tạm thời kết thúc phần part 3 ở đây. Mong các bạn thông cảm. Ở phần tiếp theo, tôi sẽ tiếp tục tạo model mongoose, để thực hiện việc tạo User... Mời các bạn đón xem tiếp. Cảm ơn các bạn

Các bạn có thể lấy code tại link github, không có template đâu nhé. nếu muốn có vui lòng, kéo xuống và đăng ký tại Khởi động, Build một blog + chat sử dụng nodejs, expressjs, mongodb, firebase., vì nó dính tới bản quyền.

Có thể bạn đã bị missing