重构路由;重构控制器;优化跨域中间件;移除日志模块;
parent
41e4f9de6d
commit
c9d1939502
|
@ -23,7 +23,6 @@ export default {
|
|||
website: 'localhost',
|
||||
domain: '', // cookie域, 默认等于website
|
||||
port: 3000,
|
||||
routeMode: 'action', // action | __main__
|
||||
env: process.env.NODE_ENV === ENV_PROD ? ENV_PROD : ENV_DEV,
|
||||
debug: process.env.NODE_ENV === ENV_DEV, // debug模式
|
||||
smtp: {
|
65
index.js
65
index.js
|
@ -9,20 +9,16 @@ import 'es.shim' // 加载拓展方法
|
|||
import http from 'http'
|
||||
import path from 'path'
|
||||
import fs from 'iofs'
|
||||
// import Ioredis from 'ioredis'
|
||||
|
||||
import Request from '@gm5/request'
|
||||
import Response from '@gm5/response'
|
||||
// import Session from '@gm5/session'
|
||||
import { sessionStore, sessionWare } from '@gm5/session'
|
||||
import Jwt from '@gm5/jwt'
|
||||
|
||||
import init from './lib/reg-init.js'
|
||||
import Log from './lib/log.js' //基础日志记录工具
|
||||
import config from './config/index.js'
|
||||
|
||||
import routerWare from './middleware/router.js'
|
||||
import credentialsWare from './middleware/credentials.js'
|
||||
|
||||
// import sessionWare from './module/session.js'
|
||||
|
||||
var log = console.log
|
||||
import corsWare from './middleware/cors.js'
|
||||
|
||||
function hideProperty(host, name, value) {
|
||||
Object.defineProperty(host, name, {
|
||||
|
@ -35,37 +31,26 @@ function hideProperty(host, name, value) {
|
|||
|
||||
export default class Five {
|
||||
constructor() {
|
||||
hideProperty(this, '__FIVE__', Object.assign({}, init))
|
||||
hideProperty(this, '__FIVE__', config)
|
||||
hideProperty(this, '__MODULES__', {})
|
||||
hideProperty(this, '__MIDDLEWARE__', [credentialsWare])
|
||||
hideProperty(this, '__MIDDLEWARE__', [corsWare])
|
||||
}
|
||||
|
||||
__init__() {
|
||||
__main__() {
|
||||
var { domain, website, session } = this.__FIVE__
|
||||
domain = domain || website
|
||||
session.domain = session.domain || domain
|
||||
this.set({ domain, session })
|
||||
|
||||
// 这里只创建session的存储器, 而初始化操作在中间件中进行
|
||||
// if (session.type === 'redis') {
|
||||
// hideProperty(
|
||||
// this,
|
||||
// '__SESSION_STORE__',
|
||||
// new Ioredis({
|
||||
// host: session.db.host || '127.0.0.1',
|
||||
// port: session.db.port || 6379,
|
||||
// db: session.db.db || 0
|
||||
// })
|
||||
// )
|
||||
// } else {
|
||||
// hideProperty(this, '__SESSION_STORE__', {})
|
||||
// }
|
||||
// 安装jwt
|
||||
this.install(Jwt)
|
||||
|
||||
// 将session和cookie的中间件提到最前
|
||||
// 以便用户自定义的中间件可以直接操作session和cookie
|
||||
// this.__MIDDLEWARE__.unshift(sessionWare)
|
||||
// this.__MIDDLEWARE__.unshift(credentialsWare)
|
||||
// 将session中间件提到最前
|
||||
// 以便用户自定义的中间件可以直接操作session
|
||||
this.install(sessionStore)
|
||||
this.__MIDDLEWARE__.unshift(sessionWare)
|
||||
|
||||
// 路由中间件要在最后
|
||||
this.use(routerWare)
|
||||
}
|
||||
|
||||
|
@ -81,7 +66,7 @@ export default class Five {
|
|||
try {
|
||||
Object.assign(this.__FIVE__[i], obj[i])
|
||||
} catch (err) {
|
||||
log(err)
|
||||
console.error(err)
|
||||
}
|
||||
}
|
||||
} else {
|
||||
|
@ -105,7 +90,14 @@ export default class Five {
|
|||
this.__MIDDLEWARE__.push(fn)
|
||||
return this
|
||||
}
|
||||
throw TypeError('argument must be a callback')
|
||||
throw TypeError('argument must be a function')
|
||||
}
|
||||
|
||||
// 注入实例化对象到实例池中
|
||||
// 与use方法不同的是, 这个会在server创建之前就已经执行
|
||||
install({ name, install }, args) {
|
||||
this['$$' + name] = install.call(this, args)
|
||||
return this
|
||||
}
|
||||
|
||||
// 预加载应用, 缓存以提高性能
|
||||
|
@ -133,19 +125,12 @@ export default class Five {
|
|||
return this
|
||||
}
|
||||
|
||||
// 注入实例化对象到实例池中
|
||||
// 与use方法不同的是, 这个会在server创建之前就已经执行
|
||||
install({ name, install }) {
|
||||
this['$$' + name] = install.call(this, this.__FIVE__)
|
||||
return this
|
||||
}
|
||||
|
||||
// 启动http服务
|
||||
listen(port) {
|
||||
var _this = this
|
||||
var server
|
||||
|
||||
this.__init__()
|
||||
this.__main__()
|
||||
|
||||
server = http.createServer(function(req, res) {
|
||||
var request = new Request(req, res)
|
||||
|
|
48
lib/log.js
48
lib/log.js
|
@ -1,48 +0,0 @@
|
|||
/**
|
||||
* 简单的日志封装
|
||||
* @author yutent<yutent.io@gmail.com>
|
||||
* @date 2020/09/18 16:07:26
|
||||
*/
|
||||
|
||||
import fs from 'iofs'
|
||||
import path from 'path'
|
||||
|
||||
export default class Log {
|
||||
constructor(file = 'run_time.log', dir = './') {
|
||||
if (!dir) {
|
||||
throw new Error(`agument dir must be a string, but ${typeof dir} given.`)
|
||||
}
|
||||
|
||||
if (!fs.exists(dir)) {
|
||||
fs.mkdir(dir)
|
||||
}
|
||||
|
||||
this.file = path.resolve(dir, file)
|
||||
}
|
||||
|
||||
error(str) {
|
||||
this.save(str, 'error')
|
||||
}
|
||||
|
||||
info(str) {
|
||||
this.save(str, 'info')
|
||||
}
|
||||
|
||||
warn(str) {
|
||||
this.save(str, 'warning')
|
||||
}
|
||||
|
||||
debug(str) {
|
||||
this.save(str, 'debug')
|
||||
}
|
||||
|
||||
//写入日志文件
|
||||
save(str, type) {
|
||||
type = type || 'debug'
|
||||
fs.echo(
|
||||
`[${type}] ${new Date().format('Y-m-d_H:i:s')} ${str} \n`,
|
||||
this.file,
|
||||
true
|
||||
)
|
||||
}
|
||||
}
|
|
@ -6,10 +6,6 @@
|
|||
|
||||
export default function(req, res, next) {
|
||||
var debug = this.get('debug')
|
||||
if (this.__MODULES__.__error__) {
|
||||
var err = this.__MODULES__.__error__
|
||||
return res.error(debug ? err.stack || err : err, err.status || 500)
|
||||
}
|
||||
|
||||
// 1. 先判断控制器是否存在
|
||||
if (!this.__MODULES__[req.app]) {
|
||||
|
@ -23,16 +19,23 @@ export default function(req, res, next) {
|
|||
|
||||
// 3. 实例化控制器
|
||||
this.__MODULES__[req.app]
|
||||
.then(({ default: Mod }) => {
|
||||
.then(async ({ default: Mod }) => {
|
||||
var app
|
||||
var err = ''
|
||||
|
||||
if (Mod) {
|
||||
app = new Mod({ ctx: this, req, res })
|
||||
app = new Mod()
|
||||
app.__f_i_v_e__(this, req, res)
|
||||
|
||||
// 4. 优先执行__main__方法
|
||||
if (app.__main__) {
|
||||
try {
|
||||
await app.__main__()
|
||||
} catch (err) {
|
||||
return Promise.reject(err)
|
||||
}
|
||||
}
|
||||
|
||||
// action模式, 则路由自动调用对应的action方法
|
||||
// __main__模式, 则路由全部走__main__方法
|
||||
if (this.get('routeMode') === 'action') {
|
||||
var route = req.path.shift()
|
||||
var act = route + 'Action'
|
||||
|
||||
|
@ -40,15 +43,8 @@ export default function(req, res, next) {
|
|||
return app[act].apply(app, req.path)
|
||||
} else {
|
||||
err = new Error(`Route [${route}] not found`)
|
||||
}
|
||||
} else {
|
||||
if (app.__main__) {
|
||||
return app.__main__.apply(app, req.path)
|
||||
} else {
|
||||
err = new Error('__main__() not found')
|
||||
}
|
||||
}
|
||||
err.status = 404
|
||||
}
|
||||
} else {
|
||||
err = new Error(`Controller [${req.app}] load error`)
|
||||
err.status = 500
|
||||
|
|
|
@ -1,15 +1,16 @@
|
|||
{
|
||||
"name": "@gm5/core",
|
||||
"version": "3.2.6",
|
||||
"version": "1.0.0",
|
||||
"type": "module",
|
||||
"description": "Five.js, 一个轻量级的nodejs mvc框架 旨在简单易用, 5分钟即可上手",
|
||||
"author": "yutent <yutent.io@gmail.com>",
|
||||
"main": "index.js",
|
||||
"dependencies": {
|
||||
"@gm5/session": "^1.0.0",
|
||||
"@gm5/request": "^1.2.0",
|
||||
"@gm5/response": "^1.3.0",
|
||||
"@gm5/request": "^1.2.1",
|
||||
"@gm5/response": "^1.3.1",
|
||||
"@gm5/controller": "^1.0.0",
|
||||
"@gm5/jwt": "^1.1.0",
|
||||
"crypto.js": "^2.0.1",
|
||||
"es.shim": "^2.0.1",
|
||||
"iofs": "^1.5.0"
|
||||
|
|
Loading…
Reference in New Issue