Koa搭建简单服务器
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搭建简单服务器的更多相关文章
- Node安装及搭建简单服务器
注:本文安装系统为mac,windows及其他系统下载对应安装包 ,mac下载后的安装包为apk文件,windows为msi文件. 安装 1.在网上下载node安装包,官方网站2.双击下载文件,按步骤 ...
- 利用gulp搭建简单服务器,gulp标准版
var gulp = require('gulp'), autoprefixer = require('gulp-autoprefixer'), //自动添加css前缀 rename = requir ...
- nodeJs搭建简单服务器
实现简单的例子:hello word 把第一个文件命名为server.js 在server.js里写入 var http = require("http"); http.crea ...
- python3+socket搭建简易服务器
踩了一上午的坑之后,终于对网络编程有了一点大致的.基本的了解.真的是0基础,之前对socket网络编程一点都不知道.(感觉自己与时代脱轨....) 首先我想对这些美妙的专业术语进行一番搜索: 服务器: ...
- 使用 Nodejs 搭建简单的Web服务器
使用Nodejs搭建Web服务器是学习Node.js比较全面的入门教程,因为要完成一个简单的Web服务器,你需要学习Nodejs中几个比较重要的模块,比如:http协议模块.文件系统.url解析模块. ...
- Ubuntu 14.04搭建简单git服务器
/****************************************************************************** * Ubuntu 14.04搭建简单gi ...
- mongoDB介绍、安装、搭建简单的mongoDB服务器(一)
相关网站 1. http://www.mongodb.org/ 官网,可以下载安装程序,和doc,和驱动等. 2. http://www.mongoing.com/ 国内官方网站,博客,问题谈论等 ...
- 【netty】(2)---搭建一个简单服务器
netty(2)---搭建一个简单服务器 说明:本篇博客是基于学习慕课网有关视频教学.效果:当用户访问:localhost:8088 后 服务器返回 "hello netty"; ...
- 总结一下搭建简单Web服务器的一些方法
使用nodejs+anywhere模块搭建静态文件服务器 anywhere随时随地将你的当前目录变成一个静态文件服务器的根目录. 安装npm install anywhere -g,然后进入任意目录在 ...
随机推荐
- Directx11教程(45) alpha blend(2)
原文:Directx11教程(45) alpha blend(2) 在myTutorialD3D11_40中,我们在场景中再添加一个box,并把box放在水里,实现半透明的效果.如下图所示: ...
- day39-Spring 05-Spring的AOP:不带有切点的切面
Spring底层的代理的实现: 不带切点的切面是对类里面的所有的方法都进行拦截. 做Spring AOP的开发需要两个包:一个是AOP的包,一个是AOP联盟的包(因为规范是由AOP联盟提出来的). 用 ...
- 轻松搞定word中让人抓狂的自动编号
在word中使用自动编号时,如果一级编号是2,想让其后面的二级编号自动编号为2.1.2.2--,三级编号自动编号为2.1.1.2.1.2--:且在该一级编号调整为3时,后面的二级编号和三级编号的第一位 ...
- js全局方法
1.eval() 参数:string要计算的表达式或要执行的语句 返回值:计算结果或者执行结果 使用方法: (1)eval("2+2")返回值:4 (2)eval("x= ...
- MyBatis动态SQL(一)
MyBatis 的强大特性之一便是它的动态 SQL.动态 SQL 元素和 JSTL 或基于类似 XML 的文本处理器相似.在 MyBatis 之前的版本中,有很多元素需要花时间了解.MyBatis 3 ...
- 用select提取List元素自身序号
var cs = currentCitys.Select((c, i) => new { id = c.CITY_ID, 序号 = (i + 1).ToString(), 城市类型 = c.IS ...
- JVM 调优 —— GC 长时间停顿问题及解决方法
零. 简介 垃圾收集器长时间停顿,表现在 Web 页面上可能是页面响应码 500 之类的服务器错误问题,如果是个支付过程可能会导致支付失败,将造成公司的直接经济损失,程序员要尽量避免或者说减少此类情况 ...
- MapReduce数据流-Mapper
- Redis源码解析:03字典
字典是一种用于保存键值对(key value pair)的抽象数据结构.在字典中,一个键和一个值进行关联,就是所谓的键值对.字典中的每个键都是独一无二的,可以根据键查找.更新值,或者删除整个键值对等等 ...
- The Top 50 Proprietary Programs that Drive You Crazy — and Their Open Source Alternatives
The Top 50 Proprietary Programs that Drive You Crazy — and Their Open Source Alternatives 01 / 22 / ...