欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Koa搭建简单服务器

程序员文章站 2022-07-02 17:58:13
1. dependencies 2. 主服务 引包 错误处理 服务端渲染 koa-ejs 路由 koa-router 开放静态资源 koa-static session koa-session 1. .keys 文件是通过脚本生成的用来 session 签名的密钥,数组,每个元素都是无规律的不同字符 ......

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. 主服务

引包

 1 const fs = require('fs');
 2 const path = require('path');
 3 const koa = require('koa');
 4 const router = require('koa-router');
 5 const session = require('koa-session');
 6 const ejs = require('koa-ejs');
 7 const body = require('koa-better-body');
 8 
 9 const _static = require('./routers/static');
10 const config = require('./config');
11 
12 const app = new koa();
13 const router = new router();

错误处理

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

服务端渲染 koa-ejs

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

路由 koa-router

1 router.use('/admin', require('./routers/admin')); // localhost:8080/admin/xxx
2 router.use('/api', require('./routers/api')); // localhost:8080/api/xxx
3 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. 这里可以使用同步读取文件的方式,因为是在启动服务的时候,只读取一次,所以,不会影响服务器性能

1 app.keys = fs.readfilesync('.keys').tostring().split('\r\n');
2 app.use(session({
3     maxage: 20 * 60 * 1000, // 缓存时间 20 分钟
4     renew: true // 自动续期
5 }, app));

处理 post 数据 koa-better-body

1 app.use(body({
2     uploaddir: config.upload_dir
3 }));

数据库 mysql co-mysql

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

配置

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

1 app.context.config = config;
1 app.listen(config.http_port, () => console.log(`server running on ${config.http_port}...`));
2 app.use(router.routes());

3. 数据库

 1 const mysql = require('mysql');
 2 const co = require('co-mysql');
 3 
 4 const config = require('../config');
 5 
 6 const conn = mysql.createpool({
 7     host: config.db_host,
 8     user: config.db_user,
 9     password: config.db_pass,
10     port: config.db_port,
11     database: config.db_name
12 });
13 
14 module.exports = co(conn);

4. md5

 1 const crypto = require('crypto');
 2 const config = require('../config');
 3 
 4 module.exports = {
 5     // 生成 md5 值
 6     md5 (buffer) {
 7         const obj = crypto.createhash('md5');
 8         obj.update(buffer + config.md5_keys);
 9         return obj.digest('hex');
10     }
11 };