This repository was archived by the owner on Oct 10, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 31
/
Copy pathserver.js
112 lines (85 loc) · 2.62 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
process.env.NODE_ENV = 'production'
process.chdir(__dirname)
const NextServer = require('next/dist/server/next-server').default
const http = require('http')
const path = require('path')
const url = require('url')
const appInsights = require('applicationinsights')
const nextConfig = require('./next.config.json')
// Make sure commands gracefully respect termination signals (e.g. from Docker)
process.on('SIGTERM', () => process.exit(0))
process.on('SIGINT', () => process.exit(0))
const getPort = (defaultPort) => {
const envPort = process.env.PORT
if (typeof envPort === 'undefined') {
return defaultPort
}
const parsedPort = parseInt(envPort, 10)
return Number.isNaN(parsedPort) ? envPort : parsedPort
}
const getEnv = (defaultEnv) => {
const env = process.env.APP_ENV || process.env.NODE_ENV
if (typeof env !== 'undefined') {
return env
}
return defaultEnv
}
const initAppInsights = (connectionString) => {
if (!connectionString) {
return false
}
appInsights
.setup(connectionString)
.setAutoCollectConsole(true, true)
.setSendLiveMetrics(true)
.start()
return true
}
const useAppInsights = initAppInsights(
process.env.NEXT_PUBLIC_APPINSIGHTS_CONNECTION_STRING
)
let nextRequestHandler
const server = http.createServer(async (req, res) => {
if (useAppInsights) {
appInsights.defaultClient.trackNodeHttpRequest({
request: req,
response: res
})
}
const parsedUrl = url.parse(req.url, true)
try {
await nextRequestHandler(req, res, parsedUrl)
} catch (err) {
if (useAppInsights) {
appInsights.defaultClient.trackException({ exception: err })
}
// eslint-disable-next-line no-console
console.error(err)
res.statusCode = 500
res.end('internal server error')
}
})
const serverEnv = getEnv('production')
const serverConfig = {
hostname: '0.0.0.0',
port: getPort(3000),
dir: path.join(__dirname),
dev: serverEnv === 'development',
conf: nextConfig
}
server.listen(serverConfig.port, serverConfig.hostname, (err) => {
if (err) {
if (useAppInsights) {
appInsights.defaultClient.trackException({ exception: err })
}
// eslint-disable-next-line no-console
console.error('Failed to start server', err)
process.exit(1)
}
const nextServer = new NextServer(serverConfig)
nextRequestHandler = nextServer.getRequestHandler()
// eslint-disable-next-line no-console
console.log(
`> Server listening at http://${serverConfig.hostname}:${serverConfig.port} as ${serverEnv} env`
)
})