-
Notifications
You must be signed in to change notification settings - Fork 0
/
app.js
188 lines (168 loc) · 5.3 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
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
var createError = require('http-errors')
var express = require('express')
var path = require('path')
var cookieParser = require('cookie-parser')
var logger = require('morgan')
var sassMiddleware = require('node-sass-middleware')
var favicon = require('serve-favicon')
// 子进程
const { spawn, fork } = require('child_process')
// spawn('node', ['./script/child.js'])
// fork('./script/child.js')
// 'ping', ['www.baidu.com']
// const spawnObj = spawn('node', ['./script/child.js'], { encoding: 'utf-8' })
// spawnObj.stdout.on('data', function(chunk) {
// console.log('chunk: ', chunk.toString())
// })
// spawnObj.stderr.on('data', data => {
// console.log(data)
// })
// spawnObj.on('close', code => {
// console.log('close code : ' + code)
// })
// spawnObj.on('exit', code => {
// console.log('exit code : ' + code)
// })
var session = require('express-session')
var Store = require('connect-mongo')(session)
// jwt token 认证
var jwt = require('jsonwebtoken')
var { secret } = require('./config/constant')
var jwtAuth = require('./middleware/jwt')
// passport 第三方登陆
const passport = require('passport')
const { Strategy: GithubStrategy } = require('passport-github')
const { github_client_id, github_client_secret } = require('./config/constant')
// mongoose 数据库
var mongoose = require('mongoose')
// 自定义路由
var indexRouter = require('./routes/index')
var usersRouter = require('./routes/user')
var authRouter = require('./routes/auth')
var app = express()
// 链接mongodb
const host = process.env.DOCKER ? 'customise_mongo' : '0.0.0.0' //192.168.100.7
var mongodbUrl = `mongodb://${host}/leone`
mongoose.connect(mongodbUrl, { useNewUrlParser: true, useCreateIndex: true })
mongoose.Promise = global.Promise
mongoose.connection.on('error', e => {
mongoose.connection.close()
console.log('mongodb connect error:', e)
})
mongoose.connection.once('open', () => {
console.log('mongodb connect success!')
})
global.To = promise => promise.then(data => [null, data]).catch(err => [err])
// view engine setup
app.set('views', path.join(__dirname, 'views'))
app.set('view engine', 'pug')
app.use(logger('dev'))
app.use(express.json())
app.use(express.urlencoded({ extended: false }))
app.use(cookieParser())
app.use(
sassMiddleware({
src: path.join(__dirname, 'public'),
dest: path.join(__dirname, 'public'),
indentedSyntax: true, // true = .sass and false = .scss
sourceMap: true
})
)
app.use(express.static(path.join(__dirname, 'public')))
app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')))
// session 持久化
app.use(
session({
secret: 'testsessiontomongodb',
cookie: { maxAge: 1000 * 60 * 3 },
resave: true, // session 没修改 也保存
saveUninitialized: false, // 未初始化 不保存
store: new Store({
mongooseConnection: mongoose.connection
})
})
)
// passport github 策略
passport.use(
new GithubStrategy(
{
clientID: github_client_id,
clientSecret: github_client_secret,
callbackURL: '/auth/github/return'
},
(accessToken, refreshToken, profile, done) => {
// console.log('github profile:', profile)
console.log('accessToken :', accessToken)
console.log(' refreshToken:', refreshToken)
// 获取user
const { id: github_id, username, profileUrl, provider } = profile
const user = {
github_id,
username,
passsword: '123456',
profileUrl,
provider,
token: accessToken
}
console.error('github user:', user, username)
// 可保存到store
return done(null, user)
}
)
)
// 保存到 session req.session.passport.user
passport.serializeUser((user, done) => done(null, user))
// 保存到 req.user
passport.deserializeUser((user, done) => done(null, user))
// passport 认证
app.use(passport.initialize())
app.use(passport.session())
// token 验证
app.use((req, res, next) => {
console.error('session token ', req.session.token)
console.error('cookie token ', req.cookies)
console.error('req user ', req.user)
console.error('session user ', req.session.passport)
const token =
req.session.token || req.cookies.token || (req.user && req.user.token)
if (token) {
req.body.token = token
req.headers.authorization = 'Bearer ' + token
res.setHeader('Authorization', 'Bearer ' + token)
}
next()
})
app.use(jwtAuth)
// app.use((req, res, next) => {
// const token =
// req.body.token || req.query.token || req.headers['Authorization']
// if (token) {
// jwt.verify(token, secret, (err, decoded) => {
// console.error('verify: ', err, decoded)
// next()
// })
// } else {
// console.error('no token')
// return res
// .status(403)
// .send({ success: false, message: 'no token provided' })
// }
// })
app.use('/', indexRouter)
app.use('/user', usersRouter)
app.use('/auth', authRouter)
app.use('/puppeteer', require('./routes/puppeteer'))
// catch 404 and forward to error handler
app.use(function(req, res, next) {
next(createError(404))
})
// error handler
app.use(function(err, req, res, next) {
// set locals, only providing error in development
res.locals.message = err.message
res.locals.error = req.app.get('env') === 'development' ? err : {}
// render the error page
res.status(err.status || 500)
res.render('error')
})
module.exports = app