Code files
This commit is contained in:
@@ -0,0 +1,61 @@
|
||||
const Koa = require('koa')
|
||||
const helmet = require('koa-helmet')
|
||||
const app = new Koa()
|
||||
const router = require('koa-router')()
|
||||
const views = require('koa-views')
|
||||
const co = require('co')
|
||||
const json = require('koa-json')
|
||||
const onerror = require('koa-onerror')
|
||||
const bodyparser = require('koa-bodyparser')
|
||||
const serve = require('koa-static')
|
||||
const path = require('path')
|
||||
const log4js = require('koa-log4')
|
||||
const logger = log4js.getLogger('app')
|
||||
|
||||
const index = require('./routes/index')
|
||||
const users = require('./routes/users')
|
||||
|
||||
// middlewares
|
||||
app.use(helmet())
|
||||
app.use(bodyparser())
|
||||
app.use(json())
|
||||
app.use(log4js.koaLogger(log4js.getLogger('http'), { level: 'auto' }))
|
||||
app.use(serve(path.join(__dirname, 'public')))
|
||||
|
||||
// handle error
|
||||
onerror(app)
|
||||
|
||||
// setup view
|
||||
app.use(views(path.join(__dirname, 'views'), {
|
||||
extension: 'jade'
|
||||
}))
|
||||
|
||||
// logger
|
||||
// app.use(async (ctx, next) => {
|
||||
// const start = new Date()
|
||||
// await next()
|
||||
// const ms = new Date() - start
|
||||
// logger.info(`${ctx.method} ${ctx.url} - ${ms}ms`)
|
||||
// })
|
||||
app.use(co.wrap(function * (ctx, next) {
|
||||
const start = new Date()
|
||||
yield next()
|
||||
const ms = new Date() - start
|
||||
logger.info(`${ctx.method} ${ctx.url} - ${ms}ms`)
|
||||
}))
|
||||
|
||||
// routes definition
|
||||
router.use('/', index.routes(), index.allowedMethods())
|
||||
router.use('/users', users.routes(), users.allowedMethods())
|
||||
|
||||
// mount root routes
|
||||
app.use(router.routes())
|
||||
.use(router.allowedMethods())
|
||||
|
||||
// log error
|
||||
app.on('error', function (err, ctx) {
|
||||
logger.error(err)
|
||||
logger.error('server error', err, ctx)
|
||||
})
|
||||
|
||||
module.exports = app
|
||||
@@ -0,0 +1,106 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
/**
|
||||
* Module dependencies.
|
||||
*/
|
||||
|
||||
const app = require('../app')
|
||||
const http = require('http')
|
||||
const path = require('path')
|
||||
|
||||
const appDir = path.resolve(__dirname, '..')
|
||||
const logDir = path.join(appDir, 'logs')
|
||||
/**
|
||||
* make a log directory, just in case it isn't there.
|
||||
*/
|
||||
try {
|
||||
require('fs').mkdirSync(logDir)
|
||||
} catch (e) {
|
||||
if (e.code !== 'EEXIST') {
|
||||
console.error('Could not set up log directory, error was: ', e)
|
||||
process.exit(1)
|
||||
}
|
||||
}
|
||||
const log4js = require('koa-log4')
|
||||
log4js.configure(path.join(appDir, 'log4js.json'), { cwd: logDir })
|
||||
const logger = log4js.getLogger('startup')
|
||||
/**
|
||||
* Get port from environment and store in Express.
|
||||
*/
|
||||
|
||||
var port = normalizePort(process.env.PORT || '3000')
|
||||
// app.set('port', port)
|
||||
|
||||
/**
|
||||
* Create HTTP server.
|
||||
*/
|
||||
|
||||
var server = http.createServer(app.callback())
|
||||
|
||||
/**
|
||||
* Listen on provided port, on all network interfaces.
|
||||
*/
|
||||
|
||||
server.listen(port)
|
||||
server.on('error', onError)
|
||||
server.on('listening', onListening)
|
||||
|
||||
/**
|
||||
* Normalize a port into a number, string, or false.
|
||||
*/
|
||||
|
||||
function normalizePort (val) {
|
||||
var port = parseInt(val, 10)
|
||||
|
||||
if (isNaN(port)) {
|
||||
// named pipe
|
||||
return val
|
||||
}
|
||||
|
||||
if (port >= 0) {
|
||||
// port number
|
||||
return port
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
|
||||
/**
|
||||
* Event listener for HTTP server "error" event.
|
||||
*/
|
||||
|
||||
function onError (error) {
|
||||
if (error.syscall !== 'listen') {
|
||||
throw error
|
||||
}
|
||||
|
||||
var bind = typeof port === 'string'
|
||||
? 'Pipe ' + port
|
||||
: 'Port ' + port
|
||||
|
||||
// handle specific listen errors with friendly messages
|
||||
switch (error.code) {
|
||||
case 'EACCES':
|
||||
logger.error(bind + ' requires elevated privileges')
|
||||
process.exit(1)
|
||||
break
|
||||
case 'EADDRINUSE':
|
||||
logger.error(bind + ' is already in use')
|
||||
process.exit(1)
|
||||
break
|
||||
default:
|
||||
throw error
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Event listener for HTTP server "listening" event.
|
||||
*/
|
||||
|
||||
function onListening () {
|
||||
var addr = server.address()
|
||||
var bind = typeof addr === 'string'
|
||||
? 'pipe ' + addr
|
||||
: 'port ' + addr.port
|
||||
logger.info('Listening on ' + bind)
|
||||
}
|
||||
@@ -0,0 +1,66 @@
|
||||
var gulp = require('gulp')
|
||||
var nodemon = require('gulp-nodemon')
|
||||
var sourcemaps = require('gulp-sourcemaps')
|
||||
var concat = require('gulp-concat')
|
||||
var uglify = require('gulp-uglify')
|
||||
var cssmin = require('gulp-cssmin')
|
||||
var del = require('del')
|
||||
var path = require('path')
|
||||
|
||||
var client = {
|
||||
js: {
|
||||
src: 'client/js',
|
||||
dest: 'public/js'
|
||||
},
|
||||
css: {
|
||||
src: 'client/css',
|
||||
dest: 'public/css'
|
||||
}
|
||||
}
|
||||
|
||||
gulp.task('default', ['jsmin', 'cssmin', 'start'])
|
||||
|
||||
gulp.task('start', function () {
|
||||
nodemon({
|
||||
script: 'bin/www',
|
||||
ext: 'js css ejs',
|
||||
ignore: ['public', 'logs'],
|
||||
tasks: function (files) {
|
||||
var tasks = []
|
||||
files.forEach(function (file) {
|
||||
if (path.relative(client.js.src, file).substr(0, 2) !== '..'
|
||||
&& !~tasks.indexOf('jsmin')) {
|
||||
tasks.push('jsmin')
|
||||
}
|
||||
if (path.relative(client.css.src, file).substr(0, 2) !== '..'
|
||||
&& !~tasks.indexOf('cssmin')) {
|
||||
tasks.push('cssmin')
|
||||
}
|
||||
})
|
||||
return tasks
|
||||
}
|
||||
})
|
||||
})
|
||||
|
||||
gulp.task('cleanjs', function () {
|
||||
return del([client.js.dest])
|
||||
})
|
||||
|
||||
gulp.task('cleancss', function () {
|
||||
return del([client.css.dest])
|
||||
})
|
||||
|
||||
gulp.task('jsmin', ['cleanjs'], function () {
|
||||
return gulp.src(client.js.src + '/**/*.js')
|
||||
.pipe(sourcemaps.init())
|
||||
.pipe(concat('graph.js'))
|
||||
.pipe(uglify())
|
||||
.pipe(gulp.dest(client.js.dest))
|
||||
})
|
||||
|
||||
gulp.task('cssmin', ['cleancss'], function () {
|
||||
return gulp.src(client.css.src + '/**/*.css')
|
||||
.pipe(concat('style.css'))
|
||||
.pipe(cssmin())
|
||||
.pipe(gulp.dest(client.css.dest))
|
||||
})
|
||||
@@ -0,0 +1,38 @@
|
||||
{
|
||||
"appenders": [
|
||||
{
|
||||
"type": "console"
|
||||
},
|
||||
{
|
||||
"type": "clustered",
|
||||
"appenders": [
|
||||
{
|
||||
"type": "dateFile",
|
||||
"filename": "startup.log",
|
||||
"pattern": "-yyyy-MM-dd",
|
||||
"category": "startup"
|
||||
},
|
||||
{
|
||||
"type": "dateFile",
|
||||
"filename": "http.log",
|
||||
"pattern": "-yyyy-MM-dd",
|
||||
"category": "http"
|
||||
},
|
||||
{
|
||||
"type": "file",
|
||||
"filename": "app.log",
|
||||
"maxLogSize": 10485760,
|
||||
"numBackups": 5
|
||||
},
|
||||
{
|
||||
"type": "logLevelFilter",
|
||||
"level": "ERROR",
|
||||
"appender": {
|
||||
"type": "file",
|
||||
"filename": "errors.log"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
{
|
||||
"name": "koa-app",
|
||||
"version": "0.0.0",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"start": "node ./bin/www",
|
||||
"test": "gulp"
|
||||
},
|
||||
"dependencies": {
|
||||
"co": "^4.6.0",
|
||||
"jade": "~1.11.0",
|
||||
"koa": "^2.0.0",
|
||||
"koa-bodyparser": "^3.0.0",
|
||||
"koa-helmet": "^3.1.0",
|
||||
"koa-json": "^2.0.0",
|
||||
"koa-log4": "^2.0.1",
|
||||
"koa-onerror": "^1.2.1",
|
||||
"koa-router": "^7.0.0",
|
||||
"koa-static": "^3.0.0",
|
||||
"koa-views": "^5.0.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"del": "^2.2.0",
|
||||
"gulp": "^3.9.1",
|
||||
"gulp-concat": "^2.6.0",
|
||||
"gulp-cssmin": "^0.1.7",
|
||||
"gulp-nodemon": "^2.0.6",
|
||||
"gulp-sourcemaps": "^1.6.0",
|
||||
"gulp-uglify": "^1.5.3"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
body {
|
||||
padding: 50px;
|
||||
font: 14px "Lucida Grande", Helvetica, Arial, sans-serif;
|
||||
}
|
||||
|
||||
a {
|
||||
color: #00B7FF;
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
const co = require('co')
|
||||
const router = require('koa-router')()
|
||||
|
||||
router.get('/', co.wrap(function *(ctx, next) {
|
||||
ctx.state = {
|
||||
title: 'Welcome to Koa'
|
||||
}
|
||||
yield ctx.render('index', {})
|
||||
}))
|
||||
|
||||
// router.get('/', async function (ctx, next) {
|
||||
// ctx.state = {
|
||||
// title: 'koa2 title'
|
||||
// }
|
||||
//
|
||||
// await ctx.render('index', {
|
||||
// })
|
||||
// })
|
||||
module.exports = router
|
||||
@@ -0,0 +1,7 @@
|
||||
const router = require('koa-router')()
|
||||
|
||||
router.get('/', function (ctx, next) {
|
||||
ctx.body = 'this a users response!'
|
||||
})
|
||||
|
||||
module.exports = router
|
||||
@@ -0,0 +1,6 @@
|
||||
extends layout
|
||||
|
||||
block content
|
||||
h1= message
|
||||
h2= error.status
|
||||
pre #{error.stack}
|
||||
@@ -0,0 +1,5 @@
|
||||
extends layout
|
||||
|
||||
block content
|
||||
h1= title
|
||||
p Welcome to #{title}
|
||||
@@ -0,0 +1,7 @@
|
||||
doctype html
|
||||
html
|
||||
head
|
||||
title= title
|
||||
link(rel='stylesheet', href='/stylesheets/style.css')
|
||||
body
|
||||
block content
|
||||
Reference in New Issue
Block a user