Node.js 不正经学习(第四天 koa.js学习)

2018-08-27  本文已影响0人  Oort

Koa介绍

Koa 是下一代的 Node.js 的 Web 框架。由 Express 团队设计。旨在提供一个更小型、更富有表现力、更可靠的 Web 应用和 API 的开发基础。
Koa可以通过生成器摆脱回调,极大地改进错误处理。Koa核心不绑定任何中间件,但提供了优雅的一组可以快速和愉悦地编写服务器应用的方法。

安装

Koa 依赖 node v7.6.0 或 ES2015及更高版本和 async 方法支持.

使用npm安装

npm i koa

引入

导入koa包,并创建app

/**
 * 引入框架
 */
const Koa = require('koa');
// 创建app对象
const app = new Koa();

使用

// 监听请求并返回响应,这里响应字符串 "hello , index" 
app.use(async context => {
    context.body = 'hello , index';
});


//启动服务,绑定端口
app.listen(3000, () => {
    console.log('服务启动成功!');
});

use方法

use方法实际上执行顺序是从上往下执行,但是当使用await next(); 之后默认会将use关联的方法压入栈中,先压入得方法后执行。类似于java中阻塞线程得等待。

/**
 * 拦截请求,打出log日志。
 * 将该中间层放在栈的最顶层。顺序await之前从上往下,阻塞之后从下往上走。
 */
app.use(async (context, next) => {
    // 等待上层执行完成
    await next();
    // 获取本次响应的时间
    const responseTime = context.response.get('X-Response-Time');
    // 打印
    console.log(`${context.method} :: ${responseTime} - ${context.url}`);
});

/**
 * 往请求响应头中写入响应时间
 */
app.use(async (context, next) => {
    // 请求之前记录当前时间
    const start = Date.now();
    // 等待上层执行完成
    await next();
    // 响应之后计算等待时间单位毫秒
    const ms = Date.now() - start;
    context.set('X-Response-Time', `${ms}ms`);
});

路由模块 koa-router

路由模块使用koa-route,该模块可以简单高效的完成接口对象的抽取及绑定。
参考

npm install koa-router
/**
 * 引入第三方路由模块
 */
const _ = require('koa-route');
var router = new _();
// 请求路由集合
const pets = {
    '/about': context => {
        context.response.type = 'html';
        context.response.body = '<a href="/">关于页面</a>';
    },
    '/login': context => {
        context.response.type = 'html';
        context.response.body = '<div>登录页面</div>';
    },
    '/reg': context => {
        context.response.body = '注册页面';
    },
    '/mine': context => {
        context.response.type = 'html';
        context.response.body = '<div>个人中心</div>';
    },
    '/show/:name': (context, name) => {
        context.response.type = 'html';
        context.response.body = '<div>个人中心 ' + `${name}` + ' </div>';
    }
};
// 添加路由
Object.keys(pets).forEach(function (key) {
    app.use(_.get(key, pets[key]));
});
// 路由home路径的get请求
router.get('/home', async (ctx, next) => {
    ctx.body = 'we are at home!';
    return next();
}, async (ctx, next) => {
    ctx.body = 'home 2';
});
// 对应HTTP对应的动作,all代表所有的请求方式
router
    .get('/', async (ctx, next) => {
        ctx.body = 'Hello World!';
    })
    .post('/users', async (ctx, next) => {

    })
    .put('/users/:id', async (ctx, next) => {

    })
    .del('/users/:id', async (ctx, next) => {

    })
    .all('/users/:id', async (ctx, next) => {

    });

// 将路径路由添加到app
app
    .use(router.routes())
    .use(router.allowedMethods());

附上Demo代码

/**
 * 引入框架
 */
const Koa = require('koa');
// 创建app对象
const app = new Koa();

/**
 * 引入第三方路由模块
 */
const _ = require('koa-route');
var router = new _();



/**
 * 拦截请求,打出log日志。
 * 将该中间层放在栈的最顶层。顺序await之前从上往下,阻塞之后从下往上走。
 */
app.use(async (context, next) => {
    // 等待上层执行完成
    await next();
    // 获取本次响应的时间
    const responseTime = context.response.get('X-Response-Time');
    // 打印
    console.log(`${context.method} :: ${responseTime} - ${context.url}`);
});

/**
 * 往请求响应头中写入响应时间
 */
app.use(async (context, next) => {
    // 请求之前记录当前时间
    const start = Date.now();
    // 等待上层执行完成
    await next();
    // 响应之后计算等待时间单位毫秒
    const ms = Date.now() - start;
    context.set('X-Response-Time', `${ms}ms`);
});


// 请求路由集合
const pets = {
    '/about': context => {
        context.response.type = 'html';
        context.response.body = '<a href="/">关于页面</a>';
    },
    '/login': context => {
        context.response.type = 'html';
        context.response.body = '<div>登录页面</div>';
    },
    '/reg': context => {
        context.response.body = '注册页面';
    },
    '/mine': context => {
        context.response.type = 'html';
        context.response.body = '<div>个人中心</div>';
    },
    '/show/:name': (context, name) => {
        context.response.type = 'html';
        context.response.body = '<div>个人中心 ' + `${name}` + ' </div>';
    }
};
// 添加路由
Object.keys(pets).forEach(function (key) {
    app.use(_.get(key, pets[key]));
});
// 路由home路径的get请求
router.get('/home', async (ctx, next) => {
    ctx.body = 'we are at home!';
    return next();
}, async (ctx, next) => {
    ctx.body = 'home 2';
});
// 对应HTTP对应的动作,all代表所有的请求方式
router
    .get('/', async (ctx, next) => {
        ctx.body = 'Hello World!';
    })
    .post('/users', async (ctx, next) => {

    })
    .put('/users/:id', async (ctx, next) => {

    })
    .del('/users/:id', async (ctx, next) => {

    })
    .all('/users/:id', async (ctx, next) => {

    });

// 将路径路由添加到app
app
    .use(router.routes())
    .use(router.allowedMethods());

app.use(async context => {
    context.body = 'hello , index';
});



app.listen(3000, () => {
    console.log('服务启动成功!');
});
上一篇下一篇

猜你喜欢

热点阅读