/
server.js
150 lines (118 loc) · 4.05 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
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
require('dotenv').config();
const bodyParser = require('body-parser');
const express = require('express');
const mongoose = require('mongoose');
const cors = require('cors');
const morgan = require('morgan');
const app = express();
//** bring in passport
const passport = require('passport');
const { router: usersRouter } = require('./users');
const { router: authRouter, localStrategy, jwtStrategy} = require('./auth');
mongoose.Promise = global.Promise;
const {DATABASE_URL, PORT} = require('./config');
app.use(morgan('common'));
app.use(bodyParser.json());
// CORS
app.use(cors());
app.use(function (req, res, next) {
res.header('Access-Control-Allow-Origin', '*');
res.header('Access-Control-Allow-Headers', 'Content-Type,Authorization');
res.header('Access-Control-Allow-Methods', 'GET,POST,PUT,PATCH,DELETE');
if (req.method === 'OPTIONS') {
return res.send(204);
}
next();
});
const {Question} = require('./src/js/models');
const {UserData} = require('./src/js/userDataModel');
// app.use( '/api/js', express.static(__dirname + '/src/js') );
// We need database schemas for each endpoints
const questionRouter = require('./src/js/questionRouter');
app.use('/api/questions', questionRouter);
const userDataRouter = require('./src/js/userDataRouter');
app.use('/api/userdata', userDataRouter);
//**
passport.use(localStrategy);
passport.use(jwtStrategy);
app.use('/api/users/', usersRouter);
app.use('/api/auth', authRouter);
const jwtAuth = passport.authenticate('jwt', { session: false });
// A protected endpoint which needs a valid JWT to access it
app.get('/api/protected', jwtAuth, (req, res) => {
return res.json({
data: 'rosebud'
});
});
app.use('*', (req, res) => {
return res.status(404).json({ message: 'Not Found'})
});
// const {router} = require('./auth/router');
// app.use('/api/userdata/register', router);
//****
// app.post('/api/userdata/login', (req, res) => {
// let {username, password} = req.body;
// res.json({
// username: username,
// password: password
// })
// })
// app.use('*', function(req, res) {
// res.status(404).json({message: 'Not Found'});
// });
// From Matthew...
// set options as per http://mongoosejs.com/docs/connections.html#use-mongo-client
const options = {
//useMongoClient: true,
useUnifiedTopology: true,
useNewUrlParser: true,
autoIndex: false, // Don't build indexes
//reconnectTries: Number.MAX_VALUE, // Never stop trying to reconnect
//reconnectInterval: 500, // Reconnect every 500ms
poolSize: 10, // Maintain up to 10 socket connections
// If not connected, return errors immediately rather than waiting for reconnect
bufferMaxEntries: 0
};
// closeServer needs access to a server object, but that only
// gets created when `runServer` runs, so we declare `server` here
// and then assign a value to it in run
let server;
// this function connects to our database, then starts the server
function runServer(databaseUrl=DATABASE_URL, port=PORT) {
return new Promise((resolve, reject) => {
mongoose.connect(databaseUrl, options, err => {
if (err) {
return reject(err);
}
server = app.listen(port, () => {
console.log(`Your app is listening on port ${port}`);
resolve();
})
.on('error', err => {
mongoose.disconnect();
reject(err);
});
});
});
}
// this function closes the server, and returns a promise. we'll
// use it in our integration tests later.
function closeServer() {
return mongoose.disconnect().then(() => {
return new Promise((resolve, reject) => {
console.log('Closing server');
server.close(err => {
if (err) {
return reject(err);
}
resolve();
});
});
});
}
// if server.js is called directly (aka, with `node server.js`), this block
// runs. but we also export the runServer command so other code (for instance, test code) can start the server as needed.
if (require.main === module) {
runServer().catch(err => console.error(err));
};
module.exports = {runServer, app, closeServer};