Created
October 20, 2017 10:04
-
-
Save rightson/7bcf619bdb5e615302f6181841e135a4 to your computer and use it in GitHub Desktop.
Koa example minimal server
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 'use strict'; | |
| const path = require('path'); | |
| const zlib = require('zlib'); | |
| const winston = require('winston'); | |
| const Koa = require('koa'); | |
| const Router = require('koa-router'); | |
| const koaLogger = require('winston-koa-logger'); | |
| const convert = require('koa-convert'); | |
| const compress = require('koa-compress'); | |
| const staticFiles = require('koa-static'); | |
| const body = require('koa-body'); | |
| const json = require('koa-json'); | |
| const cors = require('koa-cors'); | |
| const views = require('koa-views'); | |
| const mongoose = require('mongoose'); | |
| const env = { | |
| name: require('./package').name, | |
| mode: process.env.NODE_ENV || 'development', | |
| port: process.env.PORT || 3000, | |
| } | |
| const Schema = mongoose.Schema; | |
| mongoose.Promise = global.Promise; | |
| class Views { | |
| async index(ctx) { | |
| return `Hello, world!`; | |
| //return await ctx.render('index.html') | |
| } | |
| } | |
| function registerModel() { | |
| mongoose.model('User', new Schema({ | |
| name: String, | |
| email: String, | |
| pasword: String | |
| })); | |
| mongoose.model('Project', new Schema({ | |
| name: String, | |
| description: String, | |
| }, {strict: false })); | |
| } | |
| function getRouter() { | |
| const router = new Router(); | |
| const views = new Views(); | |
| router.get('/', views.index); | |
| return router; | |
| } | |
| async function getApp(router) { | |
| const app = new Koa(); | |
| app.use(convert(koaLogger(new winston.Logger({ | |
| level: 'debug', | |
| transports: [ | |
| new (winston.transports.Console)({ | |
| timestamp: true, | |
| colorize: true | |
| }) | |
| ], | |
| })))); | |
| app.use(compress({ flush: zlib.Z_SYNC_FLUSH })); | |
| app.use(body({ multipart: true })); | |
| app.use(convert(staticFiles(path.join(__dirname, 'public')))); | |
| app.use(convert(json({ | |
| pretty: /production/.test(env.mode)? false: true, | |
| param: 'pretty' | |
| }))); | |
| app.use(convert(cors())); | |
| app.use(views(path.join(__dirname, 'views'), { map: { html: 'nunjucks' }})); | |
| app.use(router.routes()); | |
| app.use(router.allowedMethods()); | |
| await app.listen(env.port); | |
| console.log(`${env.name} is listening port ${env.port} (${env.mode} mode)`); | |
| return app; | |
| } | |
| async function main() { | |
| let uri = `mongodb://localhost:27017/${env.mode}-test`; | |
| mongoose.connect(uri, { useMongoClient: true }); | |
| registerModel(); | |
| let router = getRouter(); | |
| return await getApp(router); | |
| } | |
| main(); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment