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,然后进入任意目录在 ...
随机推荐
- Intellij IDEA设置忽略部分类编译错误
有些时候我们的项目中有些错误,但这些错误并不影响项目的整体运行(或许是没有使用到),默认情况下idea是无法通过编译的,因此也就无法部署运行,要达到正确运行项目的目的需要作一些设置才行. 设置Inte ...
- 两篇论文之CNN中正交操作
CNN的权值正交性和特征正交性,在一定程度上是和特征表达的差异性存在一定联系的. 下面两篇论文,一篇是在训练中对权值添加正交正则提高训练稳定性,一篇是对特征添加正交性的损失抑制过拟合. 第一篇:Ort ...
- MongoDB sharding 集合不分片性能更高?
最近云上用户用户遇到一个 sharding 集群性能问题的疑惑,比较有代表性,简单分享一下 测试配置 mongos x 2.shard x 3 测试1:集合不开启分片,批量 insert 导入数据,每 ...
- 【JZOJ4869】【NOIP2016提高A组集训第9场11.7】平均数
题目描述 数据范围 解法 二分答案. 对于一个答案mid,要求出区间平均数小于mid的个数ans. 给所有数减去mid,那么问题转化为求出所有区间和为负数的个数. 对于一个区间[l,r],如果sum[ ...
- UVA_694:The Collatz Sequence
Language: C++ 4.8.2 #include<stdio.h> int main(void) { long long int m, n, copy_m; ; ; ) { sca ...
- 从DataTable中删除不被控件支持的字段类型
DataTable dt = DB.GetDataTable(sql); //从dt中删除不被控件支持的字段类型 for (int ...
- 2018-11-26-WPF-通过-DrawingContext-DrawImage-绘制图片
title author date CreateTime categories WPF 通过 DrawingContext DrawImage 绘制图片 lindexi 2018-11-26 16:1 ...
- oracle函数 NEW_TIME(dt1,c1,c2)
[功能]:给出时间dt1在c1时区对应c2时区的日期和时间 [参数]:dt1,d2 日期型 [返回]:日期时间 [参数]:c1,c2对应的 时区及其简写 大西洋标准时间:AST或ADT 阿拉斯加_夏威 ...
- part10.3-字符驱动访问揭秘
- uniapp APP端使用指纹
使用插件指纹模板: https://ext.dcloud.net.cn/plugin?id=358 Fingerprint模块管理指纹识别 要使用指纹识别功能需要具备条件: 确认当前设备环境是否支持指 ...