Express
node.js create web server
1  | // index.js  | 
Express server
Example #1
1  | # install express  | 
1  | // index.js  | 
Example #2 - add template
1  | # template engine --> ejs  | 
1  | // index.js  | 
1  | <!-- ./views/todos.ejs -->  | 
1  | <!-- ./views/todo.ejs -->  | 
Example #3 - MVC
1  | // index.js  | 
1  | // ./controllers/todo.js  | 
1  | // ./modules/todo.js  | 
Example #4 - add mysql
1  | // index.js  | 
1  | // db.js  | 
1  | // ./controllers/todo.js  | 
1  | // ./modules/todo.js  | 
1  | <!-- ./views/todos.ejs -->  | 
1  | <!-- ./views/todo.ejs -->  | 
express middleware(中介軟體)
example - simple ( query string)
1  | // index.js  | 
1  | // ./controllers/todo.js  | 
1  | // ./modules/todo.js  | 
body parser
1  | # install body parser  | 
1  | // index.js  | 
1  | // ./controllers/todo.js  | 
1  | // ./modules/todo.js  | 
1  | <!-- ./views/todos.ejs -->  | 
1  | <!-- ./views/todo.ejs -->  | 
1  | <!-- ./views/addTodo.ejs -->  | 
express session
1  | # install  | 
1  | // index.js  | 
1  | // ./controllers/todo.js  | 
1  | // ./modules/todo.js  | 
1  | <!-- ./views/todos.ejs -->  | 
1  | <!-- ./views/todo.ejs -->  | 
1  | <!-- ./views/addTodo.ejs -->  | 
1  | <!-- ./views/login.ejs -->  | 
connect-flash
- connect-flash
 - add global variable - use middleware
 
1  | # install  | 
1  | // index.js  | 
1  | // ./controllers/todo.js  | 
1  | // ./modules/todo.js  | 
1  | <!-- ./views/login.ejs -->  | 
簡易會員註冊系統
1  | # insatll bcrypt  | 
1  | // index.js  | 
1  | // ./controllers/user.js  | 
1  | // ./modules/user.js  | 
1  | <!-- ./views/user/index.ejs -->  | 
1  | <!-- ./views/user/register.ejs -->  | 
1  | <!-- ./views/user/login.ejs -->  | 
簡易留言板
1  | // index.js  | 
1  | // ./controllers/comment.js  | 
1  | // ./modules/comment.js  | 
1  | <!-- ./views/user/index.ejs -->  | 
1  | <!-- ./views/user/update.ejs -->  | 
ORM 與 Sequelize
ORM : Object Relational Mapping
Sequelize 基本操作
insatll sequelize
1  | npm install sequelize  | 
link DB and create table’s item
1  | Sequelize = require('sequelize');  | 
get/modify/delete table item
1  | // create tabel item  | 
related db control
1  | // define another table field  | 
Sequelize CLI
install sequelize-cli
1  | # install  | 
init sequeliz
1  | # init sequeliz  | 
config/config.json
change db configuration
1  | {  | 
create model
1  | # npx sequelize-cli model:generate --name User --attributes firstName:string,lastName:string,email:string  | 
migrate (generate db table)
1  | # 產生 table sequelizemeta, 存執行 log  | 
為 model 加上關聯
./models/user.js
1  | ;  | 
./models/comment.js
1  | ;  | 
create table item
index.js
1  | const db = require('./models')  | 
改造留言板
data 操作
1  | // 在 ejs 可直接使用  | 
1  | // migration - set field unique  | 
install and create DB(migrate)
1  | # install  | 
add user id for comment
./migrations/xxx-create-comment.js 加 user id
1  | ;  | 
set username unique
./migrations/xxx-create-comment.js set username unique
1  | username: {  | 
撤銷migrate then migrate
1  | # 撤銷 上一次  | 
model 加上關聯
./model/user.js
1  | ;  | 
./model/comment.js
1  | ;  | 
index.js
1  | // index.js  | 
view’s template
template/head.ejs
1  | <meta charset="UTF-8">  | 
template/navbar.ejs
1  | <nav class="navbar navbar-expand-lg navbar-light bg-light mb-3">  | 
view
user/index.ejs
1  | <!-- ./views/user/index.ejs -->  | 
user/register.ejs
1  | <!-- ./views/user/register.ejs -->  | 
user/login.ejs
1  | <!-- ./views/user/login.ejs -->  | 
user/update.ejs
1  | <!-- ./views/user/update.ejs -->  | 
control
controllers/user.js
1  | // ./controllers/user.js  | 
controllers/comment.js
1  | // ./controllers/comment.js  | 
Ngainx and PM2
PM2
command
1  | # install  | 
Nginx
install
1  | # install nginx  | 
run web server
index.js
1  | const express = require('express')  | 
index2.js
1  | const express = require('express')  | 
1  | # start web server  | 
set for DNS
configure nginx to web server
1  | sudo vim /etc/nginx/sites-available/aaa.website  | 
aaa.website
1  | server {  | 
bbb.website
1  | server {  | 
add soft link
1  | sudo ln -s /etc/nginx/sites-available/aaa.website /etc/nginx/sites-enabled/  | 
reload nginx
1  | sudo systemctl reload nginx  | 
Heroku
develop node.js - no db
install Heroku CLI
1  | heroku -v  | 
package.json add “script start” and “engines”
1  | "scripts": {  | 
set env port
app.js
1  | const port = process.env.PORT || 5001  | 
run heroku local test
1  | heroku local web  | 
develop to heroku
add .gitignore
1  | node_modules/  | 
git init and commit
1  | git init  | 
push to heroku
1  | # login  | 
develop node.js - include db
install Heroku CLI
1  | heroku -v  | 
package.json add “script start” and “engines”
1  | "scripts": {  | 
set env port
index.js
1  | const port = process.env.PORT || 3000  | 
run heroku local test
1  | heroku local web  | 
develop to heroku
add .gitignore
1  | node_modules/  | 
git init
1  | git add .  | 
push to heroku
1  | # login - if never login  | 
develop db for heroku
1  | # show logs for debug  | 
check models/index.js see use_env_variable for db parameter
1  | let sequelize;  | 
check heroku db env name
set config/config.json
1  | "production": {  | 
commit + push to heroku
1  | git add .  | 
add migrate script to package.json
1  | "scripts": {  | 
commit + push to heroku
1  | git add .  | 
heidisql link to heroku db
AWS 部署(node.js + express + nginx)
install nginx, node.js, npm, pm2
1  | # install nginx  | 
install mysql
1  | # Install MySQL  | 
其他 app 連至 MySQL
Inbound Rules 新增 HTTP TCP port:3306
mask bind-address(允許連線主機)
1  | sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf  | 
root localhost 改成 %
1  | sudo mysql -u root -p  | 
1  | # restart mysql  | 
heidisq port 3306 setting
install and start app
1  | # ftp load code ex3-sequelize  | 
run nginx
configure nginx to web server
1  | sudo vim /etc/nginx/sites-available/aaa.website  | 
aaa.website
1  | server {  | 
bbb.website
1  | server {  | 
add soft link
1  | sudo ln -s /etc/nginx/sites-available/aaa.website /etc/nginx/sites-enabled/  | 
reload nginx
1  | sudo systemctl reload nginx  | 
npm mysql
example #1
1  | # install mysql  | 
1  | // db.js  |