server side documentation
parent
be2b6b55bc
commit
da30c665d2
@ -0,0 +1,310 @@
|
||||
# Server Side
|
||||
|
||||
## Tools
|
||||
* VSCode
|
||||
* Node JS
|
||||
* [Postman](https://www.postman.com/downloads/)
|
||||
+ For Ubuntu 20.04 installation
|
||||
```
|
||||
$ sudo snap install postman
|
||||
```
|
||||
* Packages
|
||||
+ mysql : MySql database CRUD
|
||||
+ express : REST framework
|
||||
+ body-parser : for parsing html body json content
|
||||
|
||||
## Prepare Project
|
||||
* Create a new project folder
|
||||
|
||||
```bash
|
||||
// init new Node project. create package.json file
|
||||
$ npm init
|
||||
|
||||
// install packages
|
||||
$ npm install --save mysql
|
||||
$ npm install --save express body-parser
|
||||
```
|
||||
|
||||
### Quick Fix for MySQL8
|
||||
* node js packages still do not support new password scheme of MySQL8.
|
||||
* thus switch to old native scheme for node JS support. (Note : The native scheme is less secure)
|
||||
* Update MySql root password to native
|
||||
|
||||
```sql
|
||||
mysql> ALTER USER 'root'@'localhost'
|
||||
IDENTIFIED WITH mysql_native_password
|
||||
BY 'password';
|
||||
```
|
||||
|
||||
## Accessing database from nodejs
|
||||
|
||||
* CRUD operation - CREATE, READ, UPDATE, DELETE (For database operation)
|
||||
* database.js
|
||||
```javascript
|
||||
const mysql = require("mysql");
|
||||
|
||||
parameters = {
|
||||
host: "localhost",
|
||||
user: "root",
|
||||
password: "7572137",
|
||||
database: "nusbank",
|
||||
multipleStatements: true,
|
||||
};
|
||||
|
||||
let connection = mysql.createConnection(parameters);
|
||||
connection.connect((error) => {
|
||||
if (error){
|
||||
console.log(error);
|
||||
} else {
|
||||
console.log("Connection was successfull");
|
||||
}
|
||||
});
|
||||
|
||||
connection.query(`SELECT * FROM users LIMIT 5`, (err, result) => {
|
||||
if (err){
|
||||
console.log(err);
|
||||
}else{
|
||||
console.log(result);
|
||||
}
|
||||
});
|
||||
|
||||
let newuser = { id: 599,
|
||||
name: "Harry Lim",
|
||||
mail: "harrylim@abc.com",
|
||||
mobile: "99887788",
|
||||
nric: "S223311A"
|
||||
};
|
||||
|
||||
connection.query(`DELETE FROM users WHERE user_id = ${newuser.id}`, (err, result) =>{
|
||||
if (err){
|
||||
console.log(err);
|
||||
}else{
|
||||
console.log(result);
|
||||
}
|
||||
});
|
||||
|
||||
connection.query(
|
||||
`INSERT INTO users(user_id, name, mail, mobile, nric)
|
||||
VALUES (${newuser.id},'${newuser.name}', '${newuser.mail}', ${newuser.mobile}, '${newuser.nric}')`,
|
||||
(err, results) => {
|
||||
if (err){
|
||||
console.log(err);
|
||||
} else {
|
||||
if (results["affectedRows"] != 0) {
|
||||
console.log("Added", results);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
//
|
||||
connection.query(`DELETE FROM users WHERE user_id = ${newuser.id}`, (err, result) =>{
|
||||
if (err){
|
||||
console.log(err);
|
||||
}else{
|
||||
console.log(result);
|
||||
}
|
||||
});
|
||||
|
||||
// query highest monthly transaction
|
||||
connection.query(`SELECT a.user_id, u.name, a.acct_number, t.date, COUNT(a.user_id) as cmonth
|
||||
FROM transactions AS t
|
||||
INNER JOIN accounts AS a
|
||||
ON a.acct_number = t.acct_number
|
||||
INNER JOIN users AS u
|
||||
ON u.user_id = a.user_id
|
||||
GROUP BY a.user_id, MONTH(t.date), YEAR(t.date)
|
||||
ORDER BY cmonth DESC
|
||||
LIMIT 1`,
|
||||
(err, results) => {
|
||||
if (err){
|
||||
console.log(err);
|
||||
} else {
|
||||
if (results["affectedRows"] != 0) {
|
||||
console.log("Highest Montly", results);
|
||||
}
|
||||
}
|
||||
});
|
||||
```
|
||||
|
||||
## API
|
||||
* Application Programming Interface
|
||||
* Purpose : contract defining how different systems will communicate
|
||||
* Styles
|
||||
+ REST
|
||||
+ RPC : SOAP (xml format)
|
||||
+ GraphQL : By Facebook. For databases
|
||||
+ Event-Driven : For streaming services. Require realtime update.
|
||||
* REST API to expose data from MySQL
|
||||
|
||||
### REST
|
||||
* http
|
||||
* POST, GET, PUT, DELETE
|
||||
* Components
|
||||
+ URI
|
||||
+ headers
|
||||
+ key
|
||||
+ method
|
||||
|
||||
Component | Description
|
||||
----|-----
|
||||
API name |
|
||||
Description |
|
||||
Method | GET, POST, PUT, DELETE
|
||||
URI | Location, port (example:/user/id)
|
||||
Headers, Parameters, Body |
|
||||
Authentication & Authorisation | Key, bearer token
|
||||
Response | Status Code, body
|
||||
|
||||
* ExpressJS : Framework for implementing REST server
|
||||
* apis.js
|
||||
```javascript
|
||||
const express = require('express');
|
||||
const bodyParser = require('body-parser');
|
||||
|
||||
var app = express();
|
||||
|
||||
// parse body formatted in JSON
|
||||
app.use(bodyParser.json());
|
||||
|
||||
app.get('/', (req, res) => {
|
||||
res.send('Hello Express');
|
||||
});
|
||||
|
||||
app.get('/squared', (req, res) => {
|
||||
// JSON format
|
||||
// { "number": 2}
|
||||
number = req.body.number;
|
||||
squared = number * number;
|
||||
|
||||
res.send(`Squared : ${squared}`);
|
||||
|
||||
// from POSTMAN.. set Body raw content as JSON data
|
||||
// { "number": 3 }
|
||||
});
|
||||
|
||||
app.listen(process.env.PORT || 3000);
|
||||
|
||||
```
|
||||
* Powershell Environment Variable
|
||||
|
||||
```Powershell
|
||||
// create variable PORT=3001
|
||||
PS> $Env:PORT = 3001
|
||||
|
||||
// return PORT value
|
||||
PS> $Env:PORT
|
||||
|
||||
````
|
||||
|
||||
|
||||
## API & database integration
|
||||
|
||||
* server.js
|
||||
|
||||
```javascript
|
||||
const mysql = require("mysql");
|
||||
const express = require("express");
|
||||
const bodyParser = require("body-parser");
|
||||
|
||||
parameters = {
|
||||
host: "localhost",
|
||||
user: "root",
|
||||
password: "7572137",
|
||||
database: "nusbank",
|
||||
multipleStatements: true,
|
||||
};
|
||||
|
||||
let connection = mysql.createConnection(parameters);
|
||||
connection.connect((error) => {
|
||||
if (error){
|
||||
console.log(error);
|
||||
} else {
|
||||
console.log("Connection was successfull");
|
||||
}
|
||||
});
|
||||
|
||||
/// Connected
|
||||
let app = express();
|
||||
|
||||
app.use(bodyParser.json());
|
||||
|
||||
// GET route for /user query
|
||||
app.get("/user", (request, response) => {
|
||||
connection.query("SELECT * FROM users LIMIT 10", (err, result) => {
|
||||
if (err) {
|
||||
response.send("Some error occur");
|
||||
}
|
||||
else {
|
||||
response.send(result);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
// GET route for /user/id query
|
||||
// with body = { "id": 2 }
|
||||
app.get("/user/id", (request, response) => {
|
||||
console.log(request.body);
|
||||
//
|
||||
connection.query(`SELECT * FROM users WHERE user_id = ${request.body.id}`,
|
||||
(err, result) => {
|
||||
if (err) {
|
||||
response.send("Some id error occur");
|
||||
}
|
||||
else {
|
||||
response.send(result);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
/*
|
||||
POST route for /user add
|
||||
with body = {
|
||||
"id":598,
|
||||
"name": "John Heng",
|
||||
"mail": "johnheng@xyz.com",
|
||||
"mobile": 91191100,
|
||||
"nric" : "S1234765F"
|
||||
}
|
||||
*/
|
||||
app.post("/user", (request, response) => {
|
||||
console.log(request.body);
|
||||
//
|
||||
connection.query(`INSERT INTO users(user_id, name, mail, mobile, nric)
|
||||
VALUES (${request.body.id},'${request.body.name}', '${request.body.mail}', ${request.body.mobile}, '${request.body.nric}')`,
|
||||
(err, result) => {
|
||||
if (err) {
|
||||
response.send("Some record error occur");
|
||||
}
|
||||
else {
|
||||
response.send("Record saved successfully");
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
// listen port 3000
|
||||
app.listen(3000);
|
||||
|
||||
```
|
||||
|
||||
## REST and CRUD co-relation
|
||||
|
||||
REST | CRUD | Description
|
||||
----|-----|----
|
||||
GET | READ | Read record from database table
|
||||
POST | CREATE | Create record into database table
|
||||
PUT | UPDATE | Update record into database table
|
||||
DELETE | DELETE | Delete record from database table
|
||||
|
||||
## Homework 2
|
||||
* API express js code and validate using Postman
|
||||
* API documentation
|
||||
|
||||
Component | Description
|
||||
----|-----
|
||||
API name | getUserId
|
||||
Description | Get User by ID
|
||||
Method | GET
|
||||
URI | /user/id
|
||||
Headers, Parameters, Body | body { "id" : 2 }
|
||||
Response | { "user_id" : "599", "name" : "John Heng", ...}
|
||||
|
||||
Loading…
Reference in New Issue