forked from mongo-express/mongo-express
-
Notifications
You must be signed in to change notification settings - Fork 0
/
app.js
executable file
·143 lines (120 loc) · 4.52 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
#!/usr/bin/env node
'use strict';
const clc = require('cli-color');
const csrf = require('csurf');
const commander = require('commander');
const express = require('express');
const fs = require('fs');
const https = require('https');
const updateNotifier = require('update-notifier');
const middleware = require('./lib/middleware');
const utils = require('./lib/utils');
const pkg = require('./package.json');
const app = express();
const notifier = updateNotifier({ pkg });
let config;
let defaultPort = 80;
let server = app;
let sslOptions;
// Notify of any updates
notifier.notify();
try {
// eslint-disable-next-line import/no-unresolved
config = utils.deepmerge(require('./config.default'), require('./config'));
} catch (e) {
if (e.code === 'MODULE_NOT_FOUND') {
console.log('No custom config.js found, loading config.default.js');
} else {
console.error(clc.red('Unable to load config.js!'));
console.error(clc.red('Error is:'));
console.log(clc.red(e));
process.exit(1);
}
config = require('./config.default');
}
if (config.options.console) {
console.log('Welcome to mongo-express');
console.log('------------------------');
console.log('\n');
}
commander
.version(require('./package').version)
.option('-U, --url <url>', 'connection string url')
.option('-H, --host <host>', 'hostname or address of the db(deprecated)')
.option('-P, --dbport <host>', 'port of the db(deprecated)')
.option('-u, --username <username>', 'username for authentication(deprecated)')
.option('-p, --password <password>', 'password for authentication(deprecated)')
.option('-a, --admin', 'enable authentication as admin')
.option('-d, --database <database>', 'authenticate to database')
.option('--port <port>', 'listen on specified port')
.parse(process.argv);
if (commander.username && commander.password) {
config.mongodb.admin = !!commander.admin;
if (commander.admin) {
config.mongodb.adminUsername = commander.username;
config.mongodb.adminPassword = commander.password;
} else {
const user = {
database: commander.database,
username: commander.username,
password: commander.password,
};
for (const key in user) {
if (!user[key]) {
commander.help();
}
}
config.mongodb.auth[0] = user;
}
config.useBasicAuth = false;
}
if (commander.url) {
config.mongodb.connectionString = commander.url;
if (commander.admin) {
config.mongodb.admin = true;
}
}
config.mongodb.server = commander.host || config.mongodb.server;
config.mongodb.port = commander.dbport || config.mongodb.port;
config.site.port = commander.port || config.site.port;
if (!config.site.baseUrl) {
console.error('Please specify a baseUrl in your config. Using "/" for now.');
config.site.baseUrl = '/';
}
async function bootstrap() {
const resolvedMiddleware = await middleware(config);
app.use(config.site.baseUrl, resolvedMiddleware);
app.use(config.site.baseUrl, csrf());
if (config.site.sslEnabled) {
defaultPort = 443;
sslOptions = {
key: fs.readFileSync(config.site.sslKey),
cert: fs.readFileSync(config.site.sslCert),
};
server = https.createServer(sslOptions, app);
}
const addressString = (config.site.sslEnabled ? 'https://' : 'http://') + (config.site.host || '0.0.0.0') + ':' + (config.site.port || defaultPort);
server.listen(config.site.port, config.site.host, function () {
if (config.options.console) {
console.log('Mongo Express server listening', 'at ' + addressString);
if (!config.site.host || config.site.host === '0.0.0.0') {
console.error(clc.red('Server is open to allow connections from anyone (0.0.0.0)'));
}
if (config.basicAuth.username === 'admin' && config.basicAuth.password === 'pass') {
console.error(clc.red('basicAuth credentials are "admin:pass", it is recommended you change this in your config.js!'));
}
}
})
.on('error', function (e) {
if (e.code === 'EADDRINUSE') {
console.log();
console.error(clc.red('Address ' + addressString + ' already in use! You need to pick a different host and/or port.'));
console.log('Maybe mongo-express is already running?');
}
console.log();
console.log('If you are still having trouble, try Googling for the key parts of the following error object before posting an issue');
console.log(JSON.stringify(e));
return process.exit(1);
});
}
bootstrap();