1. dependencies

"co-mysql": "^1.0.0",
"koa": "^2.7.0",
"koa-better-body": "^3.0.4",
"koa-ejs": "^4.2.0",
"koa-router": "^7.4.0",
"koa-session": "^5.12.0",
"koa-static": "^5.0.0",
"mysql": "^2.17.1"

2. 主服务

引包

 const fs = require('fs');
const path = require('path');
const Koa = require('koa');
const Router = require('koa-router');
const session = require('koa-session');
const ejs = require('koa-ejs');
const body = require('koa-better-body'); const _static = require('./routers/static');
const config = require('./config'); const app = new Koa();
const router = new Router();

错误处理

 router.all('*', async (ctx, next) => { // * 表示所有的请求,都会经过这里的处理
try {
await next();
} catch (e) {
ctx.throw(500, e);
}
});

服务端渲染 koa-ejs

 ejs(app, {
root: path.resolve(__dirname, 'template'), // 模版路劲
layout: false, // 使用 render 方法渲染模版时有所区别,如果省略,会去找 template/layout.ejs
             // false: ctx.render('admin/index.ejs') 'abc': ctx.render('abc/admin/index.ejs')
viewExt: 'ejs',// 模版后缀名
cache: false, // 缓存
debug: false // 如果是 true,会把编译之后的内容全部输出
});

路由 koa-router

 router.use('/admin', require('./routers/admin')); // localhost:8080/admin/xxx
router.use('/api', require('./routers/api')); // localhost:8080/api/xxx
router.use('', require('./routers/www')); // '' 表示根,localhost:8080/xxx

开放静态资源 koa-static

_static(router, {
imageMaxAge: config.imageMaxAge,
scriptMaxAge: config.scriptMaxAge,
styleMaxAge: config.styleMaxAge,
htmlMaxAge: config.htmlMaxAge,
otherMaxAge: config.otherMaxAge
});
/*
  // 上面只是封装了, 比如
  // ...
  const static = require('koa-static');
  // ...
  router.all(/\.jsx?/i, static(path, options));
*/

session koa-session

1. .keys 文件是通过脚本生成的用来 session 签名的密钥,数组,每个元素都是无规律的不同字符组合

2. 这里可以使用同步读取文件的方式,因为是在启动服务的时候,只读取一次,所以,不会影响服务器性能

 app.keys = fs.readFileSync('.keys').toString().split('\r\n');
app.use(session({
maxAge: 20 * 60 * 1000, // 缓存时间 20 分钟
renew: true // 自动续期
}, app));

处理 POST 数据 koa-better-body

 app.use(body({
uploadDir: config.UPLOAD_DIR
}));

数据库 mysql co-mysql

1 app.context.db = require('./libs/database'); // app.context 相当于 ctx 的原型,所以,可以使用 ctx.db.query(sql语句) 来操作数据库

配置

1. 很多地方都需要 config,直接加到 app.context 上,通过 ctx.config 使用

 app.context.config = config;
 app.listen(config.HTTP_PORT, () => console.log(`Server running on ${config.HTTP_PORT}...`));
app.use(router.routes());

3. 数据库

 const mysql = require('mysql');
const co = require('co-mysql'); const config = require('../config'); const conn = mysql.createPool({
host: config.DB_HOST,
user: config.DB_USER,
password: config.DB_PASS,
port: config.DB_PORT,
database: config.DB_NAME
}); module.exports = co(conn);

4. md5

 const crypto = require('crypto');
const config = require('../config'); module.exports = {
// 生成 md5 值
md5 (buffer) {
const obj = crypto.createHash('md5');
obj.update(buffer + config.MD5_KEYS);
return obj.digest('hex');
}
};

Koa搭建简单服务器的更多相关文章

  1. Node安装及搭建简单服务器

    注:本文安装系统为mac,windows及其他系统下载对应安装包 ,mac下载后的安装包为apk文件,windows为msi文件. 安装 1.在网上下载node安装包,官方网站2.双击下载文件,按步骤 ...

  2. 利用gulp搭建简单服务器,gulp标准版

    var gulp = require('gulp'), autoprefixer = require('gulp-autoprefixer'), //自动添加css前缀 rename = requir ...

  3. nodeJs搭建简单服务器

    实现简单的例子:hello word 把第一个文件命名为server.js 在server.js里写入 var http  = require("http"); http.crea ...

  4. python3+socket搭建简易服务器

    踩了一上午的坑之后,终于对网络编程有了一点大致的.基本的了解.真的是0基础,之前对socket网络编程一点都不知道.(感觉自己与时代脱轨....) 首先我想对这些美妙的专业术语进行一番搜索: 服务器: ...

  5. 使用 Nodejs 搭建简单的Web服务器

    使用Nodejs搭建Web服务器是学习Node.js比较全面的入门教程,因为要完成一个简单的Web服务器,你需要学习Nodejs中几个比较重要的模块,比如:http协议模块.文件系统.url解析模块. ...

  6. Ubuntu 14.04搭建简单git服务器

    /****************************************************************************** * Ubuntu 14.04搭建简单gi ...

  7. mongoDB介绍、安装、搭建简单的mongoDB服务器(一)

    相关网站 1. http://www.mongodb.org/ 官网,可以下载安装程序,和doc,和驱动等. 2. http://www.mongoing.com/ 国内官方网站,博客,问题谈论等  ...

  8. 【netty】(2)---搭建一个简单服务器

    netty(2)---搭建一个简单服务器 说明:本篇博客是基于学习慕课网有关视频教学.效果:当用户访问:localhost:8088 后 服务器返回 "hello netty"; ...

  9. 总结一下搭建简单Web服务器的一些方法

    使用nodejs+anywhere模块搭建静态文件服务器 anywhere随时随地将你的当前目录变成一个静态文件服务器的根目录. 安装npm install anywhere -g,然后进入任意目录在 ...

随机推荐

  1. Asterisk 代码架构概述

    from:http://blog.csdn.net/yetyongjin/article/details/7594447 近日分析Asterisk 1.8源码.Asterisk trunk上有这篇架构 ...

  2. idea 项目热部署设置

    1.引入pom.xml() <!-- 热部署(必须) --> <dependency> <groupId>org.springframework.boot</ ...

  3. python 定义子类

  4. docker 与host互传文件

    docker 的cp命令可以从容器往外复制,也可以从本机复制的容器. docker cp 文件路径 容器id:/容器目录 docker help cp Usage:    docker cp [OPT ...

  5. IDEA-servlet项目创建web项目

    准备:1. 安装jdk1.82. 安装tomcat9.0(idea只支持4.0  9.0的服务器) 一.创建并设置javaweb工程 1.创建javaweb工程File --> New --&g ...

  6. s3c6410时钟初始化

        今天自己写bootloader做时钟初始化时遇到的问题,特记录下来.为了方便理解,我大部分都有截图, 在此我先说明下,图均来自数据手冊.也希望看了本篇文章的同志多多參看数据手冊才干理解的更加透 ...

  7. @atcoder - CODE FESTIVAL 2017 Final - J@ Tree MST

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定 N 个点,第 i 点有一个点权 Xi,再给定一棵边带权的树 ...

  8. A - Archery Tournament 动态开点+vecotor 神仙题

    存图还是像矩形一样的存,每个节点存所在区级内部的圆的编号,然后暴力判断,开始我也有这个想法,但是...这TM也能过...仔细想想,貌似好像是可以过,时间复杂度玄学无法证明.... #include&l ...

  9. @codeforces - 631E@ Product Sum

    目录 @desription@ @solution@ @accepted code@ @details@ @desription@ 给定一个序列 a,定义它的权值 \(c = \sum_{i=1}^{ ...

  10. Datamation Index

    Datamation Index     Understand how to handle big data and improve organizational agility to support ...