-
Notifications
You must be signed in to change notification settings - Fork 0
/
app.js
161 lines (134 loc) · 4.47 KB
/
app.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
const dotenv = require('dotenv').config() // Include 環境變數package
const dhtConstructor = require('./models/dht11');
const express = require('express');
const cors = require("cors");
const mongoose = require('mongoose');
const app = express();
/* = = = = = = 建立連線到Railway上Deploy的MongoDB = = = = = = */
const mongodbPwd = process.env.MONGODB_PASSWORD;
(
async () => {
try {
await mongoose.connect(`mongodb://mongo:${mongodbPwd}@containers-us-west-182.railway.app:6718`)
console.log(`MongoDB is connected!!`)
} catch (err) {
console.error("Database connection error!!", err)
}
}
)();
/* - - - - - 持續確認(監聽) =>「Railway上Deploy的MongoDB」的連線狀態 - - - - - */
const currDB = mongoose.connection; // 「目前(current):已取得連線」的資料庫
currDB.on(
"connected",
() => console.log("MongoDB is Online!!")
)
currDB.on(
"disconnected",
() => console.log("MongoDB is Offline!!")
)
currDB.on(
"error",
err => console.error("MongoDB Error!!", err)
)
/* = = = = = = = = = = = = Apply Middlewares = = = = = = = = = = = = */
/*--- Parse 「Content-Type:application/json」的「Request Body」資料 ---*/
app.use(express.json())
/*- Parse 「Content-Type:x-www-form-urlencoded」的「Request Body」資料 -*/
// false:只接受「字串」型式資料
// true:接受「所有」型式資料
app.use(express.urlencoded({ extended: false }))
/* - - - - - - 接受「所有:Origins」的HTTP Request - - - - - - */
app.use(cors())
/* = = = = = = = = = = = = 分頁顯示資料 = = = = = = = = = = = = */
app.set('view engine', 'ejs') // 設定「EJS」為「templating engine」
const docsPerPage = 10;
let totalDocs;
let lastPageNum;
/* = = = = = = = = = = = = Web route APIs = = = = = = = = = = = = */
app.get(
"/",
(req, res) => {
res.send('Real-time temperature and humidity monitoring website');
}
)
app.get(
"/data",
(req, res) => {
// 計算:目前在MongoDB「Database:sensors」的documents數量
dhtConstructor.count(
{},
(err, count) => {
totalDocs = count;
lastPageNum = Math.ceil(totalDocs / docsPerPage);
}
);
let pageNum = req.query.p || 1; // 接收頁碼
if (pageNum < 1) {
pageNum = 1;
}
let skipDocs = (pageNum - 1) * docsPerPage;
if (skipDocs >= totalDocs) {
skipDocs = 0;
}
dhtConstructor.find().select(
{ _id: 0, __v: 0 } // 將「欄位:_id、__v」從查詢中「剔除」
).sort(
{ 'time': -1 }
).skip(
skipDocs
).limit(
docsPerPage
).exec(
(err, docs) => {
res.render(
'index.ejs',
/* - - - 傳遞給「view當區域變數」的「物件:屬性值」 - - - */
{
docs: docs,
pageNum: pageNum,
lastPageNum: lastPageNum
}
);
}
);
}
);
app.post(
"/data",
async (req, res) => {
let temp = req.body.temp;
let humid = req.body.humid;
temp = temp.toFixed(2); // 取到小數第二位
// Make sure that both temp and humid have received
if (temp != undefined && humid != undefined) {
try {
const data = new dhtConstructor({ 'temperature': temp, 'humidity': humid });
await data.save();
data.show()
console.log('資料儲存成功!!\n');
// 在網頁上顯示接收到的溫濕度值
res.send(`Temperature: ${temp}, Humidity: ${humid}`);
} catch (err) {
console.error("資料儲存失敗!!", err)
}
} else {
console.log("資料接收異常!!");
}
}
);
/* - - - 輸入:不存在的URL route - - - */
app.use(
'*',
(req, res) => {
res.status(404);
res.send('Wrong web route!!');
}
)
/* = = = = = = Launch the server and listen on port = = = = = = */
const port = process.env.PORT || 3000
const hostname = '0.0.0.0'
app.listen(
port,
hostname,
err => err ? console.log("Server error!!") : console.log(`Server running at http://${hostname}:${port}/`)
)