-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathserver.coffee
More file actions
165 lines (136 loc) · 4.62 KB
/
server.coffee
File metadata and controls
165 lines (136 loc) · 4.62 KB
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
162
163
164
165
path = require 'path'
express = require 'express'
config = require 'config'
glob = require 'glob'
passport = require "passport"
router = express.Router()
fs = require 'fs'
util = require 'util'
serveStatic = require 'serve-static'
cookieParser = require "cookie-parser"
session = require 'express-session'
flash = require 'connect-flash'
cors = require 'cors'
Promise = require 'bluebird'
onFinished = require('on-finished')
co = require 'co'
moment = require 'moment'
# expose root path for future usage
RootPath = path.dirname require.main.filename
global["RootPath"] = RootPath
path = require 'path'
app = express()
# default middlewares
# setup logger
# 0. winston
logger = require path.join RootPath, "config", "logger"
errorLogger = logger.errorLogger
# 1. morgan
logformat = "END :req[X-Real-IP] - \":method :url HTTP/:http-version\" :status
:res[content-length] \":user-agent\" (:response-time ms)"
morgan = require 'morgan'
app.use morgan(logformat, {stream: logger.stream})
bodyparser = require('body-parser')
app.use bodyparser.urlencoded(extended: true)
app.use bodyparser.json()
app.use cookieParser "easi6 easiway"
app.use session
saveUninitialized: true
resave: true
secret: "puart"
app.use (req, res, next) ->
# change old res.end, res.write with new ones for response logging
old_end = res.end
res.end = (chunk) ->
if chunk? && !res.skip_logging
res.response_str = chunk.toString()
isJson = res._headers?['content-type']?.indexOf('json') >= 0
isPlain = res._headers?['content-type']?.indexOf('plain') >= 0
if isJson
logger.verbose "response:\n#{res.response_str}"
str = JSON.stringify(JSON.parse(res.response_str), null, 2)
else if isPlain
logger.verbose "response:\n#{res.response_str}"
old_end.apply(res, arguments)
next()
# LESS middleware
lessMiddleware = require 'less-middleware'
app.use '/css', lessMiddleware path.join RootPath, "app", "assets", "css"
# static files
app.use '/uploads', serveStatic './uploads'
app.use '/css', serveStatic './app/assets/css'
app.use '/js', serveStatic './app/assets/js'
app.use '/img', serveStatic './app/assets/img'
app.use '/admin/img', serveStatic './app/assets/admin/img'
app.use '/admin/css', serveStatic './app/assets/admin/css'
app.use '/admin/js', serveStatic './app/assets/admin/js'
app.use '/admin/fonts', serveStatic './app/assets/admin/fonts'
app.use '/bower', serveStatic './app/assets/bower_components'
app.use flash()
app.use passport.initialize()
app.use passport.session()
# rendering view engine set
app.set "views", "./app/views"
app.set "view engine", "jade"
app.engine "jade", require("jade").__express
# long stacktrace for promise debugging
Promise.longStackTraces()
# load glboal services
glob "#{RootPath}/config/services/*.coffee", (err, files) ->
if err
throw err
files.forEach (file) ->
require(file)(app)
# load models
db = require './app/models'
force_sync = process.env.NDOE_ENV == 'test'
db
.sequelize
.sync(force: force_sync)
.then ->
# load initializers
files = glob.sync "#{RootPath}/config/initializers/*.coffee"
files.forEach (file) ->
f = require(file)
if typeof f == 'function'
if f.length >= 1
f app, db
else
f()
global["Models"] = db
app.use (req, res, next) ->
logger.info("BEGIN #{req.headers["x-real-ip"] || req.headers["x-forwarded-for"]} - \"#{req.method}
#{req.url} HTTP/#{req.httpVersion}\"")
if Object.keys(req.body).length > 0
sensitive_keys = ["password", "new_password", "card_number", "card_cvv", "password_confirm"]
old_vals = {}
for key in sensitive_keys
if req.body[key]?
old_vals[key] = req.body[key]
req.body[key] = "[FILTERED]"
str = JSON.stringify(req.body, null, 2)
for k, v of old_vals
req.body[k] = v
logger.verbose "parameter: \n#{str}"
next()
# route setup
require("#{RootPath}/config/routes.coffee") router
app.use router
# install error handling middleware
app.use (err, req, res, next) ->
console.error err.stack
E res, err
port = process.env.PORT || config.host.port || 9000
intfc = process.env.INTERFACE || "127.0.0.1"
app.listen parseInt(port), intfc
logger.verbose "Server is listening on port #{port}"
# 현재 server pid 씀
pidpath = path.join RootPath, ".server.#{app.settings.env}.pid"
pidfd = fs.openSync pidpath, "w"
fs.writeSync pidfd, process.pid
fs.closeSync pidfd
logger.verbose "pid is written to #{pidpath}"
.catch (err) ->
console.dir err
throw err
# vim: set ts=2 sw=2: