# NodeJS tutorial
### Prepare - MySQL
1. install mysql
```
wget https://dev.mysql.com/get/mysql-apt-config_0.8.10-1_all.deb
sudo dpkg -i mysql-apt-config_0.8.10-1_all.deb
sudo apt-get update
sudo apt-get install mysql-server
mysql_secure_installation
```
2. Create user
```
$ mysql -u root -p
# enter your password, you press enter directly in first time
mysql> CREATE USER 'pj'@'%' IDENTIFIED BY 'password';
mysql> GRANT ALL PRIVILEGES ON *.* TO 'pj'@'%';
```
3. Create database
```
mysql> CREATE DATABASE wedding;
```
4. Create table
```
mysql> CREATE TABLE forms(
id BIGINT AUTO_INCREMENT PRIMARY KEY NOT NULL,
name VARCHAR(255) NOT NULL,
email VARCHAR(255) NOT NULL,
phone VARCHAR(255) NOT NULL,
others TEXT
);
### Prepare - Respository
1. clone repository
```
git clone https://github.com/pjwang0710/node_express_template.git
```
### Prepare - Environment
1. Create .env file
```
$ cd node_express_template
$ vi .env
```
2. Write `.env` file
```
API_VERSION = '1.0'
NODE_ENV = 'development'
PORT = 3000
DB_HOST = 'localhost'
DB_USERNAME = 'pj' # set your user name
DB_PASSWORD = 'password' # set your password
DB_DATABASE = 'wedding' # set your db name
```
3. install package
```
$ npm i
```
### Prepare - pm2
1. install pm2
```
$ npm install pm2 -g
```
### RUN
1. use `pm2` run `app.js`
```
$ pm2 start app.js
```
2. check your whole processes which are run by `pm2`
```
$ pm2 list
```
3. check the log from single process
```
$ pm2 log 0
```
### SET nginx
1. Modify your config
```
$ sudo vi /etc/nginx/sites-enabled/default
```
2. Add setting
```
server {
listen 80;
listen [::]:80;
listen 443;
listen [::]:443;
server_name api.DOMAIN.com;
location / {
proxy_pass http://0.0.0.0:3000/;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
### Frontend setting
#### APIs
GET `https://api.DOMAIN.com/api/1.0/forms/getForms`
Response:
```
{
"data": [
[
{
"id": 1,
"name": "pj",
"email": "daasdsad@gmail.com",
"phone": "0937123456",
"others": "NO"
},
{
"id": 2,
"name": "daniel",
"email": "pjw777888@gmail.com",
"phone": "0937123456",
"others": "Others"
},
{
"id": 3,
"name": "test",
"email": "test@gmail.com",
"phone": "0987654321",
"others": "Others"
},
{
"id": 4,
"name": "test123",
"email": "test789@gmail.com",
"phone": "0987654321",
"others": "Others"
}
]
]
}
```
POST `https://api.DOMAIN.com/api/1.0/forms/insertForm`
Request:
```
{
"name": "test123",
"phone": "0987654321",
"email": "test789@gmail.com",
"others": "Others"
}
```
Response:
```
{
"data": {}
}
```