本來打算將遊戲伺服器以及會員伺服器分開,模擬串接多遊戲的概念,但評估時間不多,暫時就以非常不得已的架構寫,
架構大概會是這篇文章所說的樣子,這一篇文章將會大概完成會員系統,不採用自動化CI/CD,以有溫度的手工搬檔案,預計會放在Heroku,為何放在這?因為我這最熟哈哈,其他平台還要摸索一陣子,先求有再求好囉!
單執行緒的狀況下去跑,因為我不知道lowdb再多執行緒會有甚麼狀況,而我也不預期之後會有太多人使用,畢竟連遊戲都還沒完成,是相當的擔心呢!但我相信價購這一步出來之後,未來的日子除了榮華富貴,只剩枯燥。
大致上分為兩個資料夾,socket以及http都監聽在同一Port,而一個是遊戲伺服器(gameServer)走的是socket,網頁伺服器(webServer)則是走一般http。
│ .env
│ .gitignore
│ app.js // 初始位置 會產出gameServer、webServer
│ LICENSE
│ package-lock.json
│ package.json
│ README.md
│
├─bin
│ www // 啟動位置
├─db //資料庫
│ lobby.json
│ users.json
│
├─errors
├─gameServer 遊戲伺服器
│ server.js
│
│
└─webServer 網頁伺服器
│ server.js // 網頁API的部分
│
├─public // 前端部分 已經bundle所以看不出來是vue樣
│ │ favicon.ico
│ │ index.html
│
└─src // 各種API對應的操作
errorController.js
mailController.js
userController.js
utils.js
// 註冊
app.post('/register', (req, res) => { })
// 登陸
app.post('/login', (req, res) => { })
// 取得使用者資訊
app.post('/userInfo', verifyToken, (req, res) => { })
// 大廳資訊
app.get('/lobby', verifyToken, (req, res) => { })
verifyToken是需要認證的中間件採用jwt認證
function verifyToken (req, res, next) {
const bearerHeader = req.headers['authorization']
if (typeof bearerHeader !== 'undefined') {
const bearer = bearerHeader.split(' ')
const bearerToken = bearer[1]
req.token = bearerToken
jwt.verify(req.token, process.env.SECRET_KEY, (err, decoded) => {
if (err) {
res.sendStatus(401)
} else {
req.userInfo = decoded.userInfo
next()
}
})
} else {
res.sendStatus(401)
}
}
當然密碼要用信箱寄送,這是大概寄信的部分。
mailController.js
function _SEND_EMAIL(_opt) {
return new Promise((resolve, reject) => {
transporter.sendMail(_opt, function(error, info) {
if (error) {
errorController.ERROR(error)
reject(error)
} else {
resolve(info.response)
}
})
})
}
隨便取了一個function來看,這是lowdb包裝後的增加使用者function。
function ADD_USER (email) {
return IS_UNI_BYEMAIL(email).then(
() =>
_valid(
_CREATE({
email: email,
password: _generatePassword(),
balance: 0
}),
'帳號創建失敗!'
),
() => {
throw 'E-MAIL已經存在,請另尋信箱。'
}
)
}
要自己補環境變數哦!信箱要拿自己申請的,且安全性調低。
.env
EMAIL_USER=xxxx@gmail.com
EMAIL_PASS=xxxx
SECRET_KEY=xxxx
這個架構大致上就是這樣,遊戲部分還沒有放上去,前端頁面也有些功能還沒有加上去,但看上去擴充並不困難。
今天就大概這樣囉!原碼就在連結!