-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathserver.js
130 lines (108 loc) · 3.82 KB
/
server.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
'use strict';
// ==================== SQL Server Client Prep ====================
// tedious (aka TDS => "Tabular Data Stream")
// SQL Server client related requires
var ConnectionPool = require('tedious-connection-pool');
var Request = require('tedious').Request;
var TYPES = require('tedious').TYPES;
// SQL Server connection configuration values
var sqlServer = process.env.sqlServer;
var sqlDatabase = process.env.sqlDatabase;
var sqlLogin = process.env.sqlLogin;
var sqlPassword = process.env.sqlPassword;
// Setup the tedious connection pool
var sqlPoolConfig = {
min: 2,
max: 4,
log: true
};
// Set the tedious sql connection details
var sqlConnectionConfig = {
userName: sqlLogin + '@' + sqlServer,
password: sqlPassword,
server: sqlServer,
// When you connect to Azure SQL Database, you need these next options.
options: {encrypt: true, database: sqlDatabase, rowCollectionOnDone: true}
};
// Create the tedious sql client connection pool.
var sqlPool = new ConnectionPool(sqlPoolConfig, sqlConnectionConfig);
// Configure the tedious connection pool to just log any pool level
// errors to the console.
sqlPool.on('error',function(err){
console.log("Pool Error!:\n" + err);
return;
});
function runQuery(res, query) {
sqlPool.acquire(function(err,poolConnection){
if(err){
console.log("An error occurred acquiring a pool connection:\n " + err);
res.json({ "error": err});
return;
}
var sqlRequest = new Request(query,
function(err) {
if (err) {
console.log('An error occurred when executing the sql request:\n' + err);
res.json({ "error": err});
}
});
var result = "";
sqlRequest.on('doneInProc', function(rowCount, more, rows) {
res.json(rows);
console.log('doneInProc: ' + rowCount + ' rows returned');
//console.log(rows.length);
rows.forEach(function(row){
row.forEach(function(column) {
if (column.value === null) {
console.log('NULL');
} else {
result+= column.value + " ";
}
});
//console.log(result);
result ="";
});
poolConnection.release();
});
poolConnection.execSql(sqlRequest);
});
}
// =================== Express Web App Prep ===================
// General express related requires...
var express = require('express');
var bodyParser = require('body-parser');
// website setup
var app = express();
var localport = process.env.localport;
var port = normalizePort(process.env.PORT || localport);
app.set('port', port)
app.use(express.static('public'));
app.use(express.static('bower_components'));
app.use(bodyParser.json());
// Used to retrieve just the last measurement for each device
// in the dbo.Measurements table in the database.
app.get('/api/devices', function(req, res) {
console.log('Retrieving devices with their last measurement');
var query="select top 3 probe_serial, reading_date, temperature_value from dbo.readings ORDER BY reading_date desc;";
runQuery(res, query);
});
app.get('/api/recent', function(req, res) {
console.log('Retrieving recent measurments from sql');
var query="select probe_serial, reading_date, temperature_value from dbo.readings where reading_date > GETDATE() -1 order by reading_date desc;";
runQuery(res, query);
});
app.listen(port, function() {
console.log('app running on http://localhost:' + port);
});
function normalizePort(val) {
var port = parseInt(val, 10);
if (isNaN(port)) {
// named pipe
return val;
}
if (port >= 0) {
// port number
return port;
}
return false;
}