• node.js中 koa 框架的基本使用方法


    一、安装 koa

    npm install koa --save
    

      

    二、简单使用

    const koa = require('koa');
    //注意使用koa需要new,跟express有点不同
    let app = new koa();
    app.listen(8888);
    
    //use()方法将中间件加入应用中
    app.use(async function (ctx, next) {
        //ctx.res 原生res
        //ctx.req 原生req
        //ctx.request 被koa包装过的req对象
        //ctx.response 被koa包装过的res对象
        ctx.response.body = 'ok';
    });
    
    //发生错误时触发
    app.on('error', function (err) {
        console.log(err);
    });
    

      

    三、级联中间件的概念

    const koa = require('koa');
    let app = new koa();
    app.listen(8888);
    
    app.use(async function (ctx, next) {
        console.log('1');
        await next();
        console.log('2');
    });
    
    app.use(async function (ctx, next) {
        console.log('3');
        await next();
        console.log('4');
    });
    
    app.use(async function (ctx, next) {
        console.log('5');
    });
    

    上述代码最终会打印出 1 3 5 4 2,koa中间件里的 await next() 之前的代码会一级一级向下执行,直到没有更多中间件执行,然后再像栈一样的执行 await next() 之后的代码。

    四、获取get请求参数

    const koa = require('koa');
    const router = require('koa-router');
    let app = new koa();
    let route = new router();
    app.listen(8888);
    
    route.get('/:id', function (ctx, next) {
        //获取请求方法
        console.log(ctx.method);
        //获取请求URL
        console.log(ctx.url);
        //获取请求路径
        console.log(ctx.path);
        //获取请求查询字符串对象
        console.log(ctx.query);
        //获取请求查询字符串
        console.log(ctx.querystring);
        //获取路由参数
        console.log(ctx.params);
        //获取请求头对象
        console.log(ctx.headers);
    });
    
    app.use(route.routes());
    

      

    五、获取post表单数据和文件上传

    安装 koa-better-body 用于解析

    npm install koa-better-body --save
    npm install koa-convert --save

     注意使用 koa-better-body 需要用 koa-convert 转换一下。

    const fs = require('fs');
    const path = require('path');
    const koa = require('koa');
    const router = require('koa-router');
    const betterBody = require('koa-better-body');
    const convert = require('koa-convert');
    let app = new koa();
    let route = new router();
    app.listen(8888);
    
    //使用koa-better-body需要用koa-convert转一下
    app.use(convert(betterBody({
        //指定上传的目录
        uploadDir: path.join(__dirname, 'uploads'),
        //是否保留扩展名
        keepExtensions: true,
        //设置上传文件大小最大限制,默认2M
        maxFileSize: 1024 * 1024 * 1024
    })));
    
    route.get('/', function (ctx, next) {
        ctx.response.set('Content-Type', 'text/html;charset=utf-8');
        ctx.body = fs.readFileSync('./index.html');
    });
    
    route.post('/post', function (ctx, next) {
        //post表单数据
        console.log(ctx.request.fields);
        //上传文件的详细信息
        console.log(ctx.request.files);
    });
    
    app.use(route.routes());
    

    index.html的代码:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>表单</title>
    </head>
    <body>
    <form action="http://localhost:8888/post" method="post" enctype="multipart/form-data">
        用户名:<input type="text" name="name"><br>
        密码:<input type="password" name="pwd"><br>
        头像:<input type="file" name="head"><br>
        信息1:<input type="file" name="info"><br>
        信息2:<input type="file" name="info"><br>
        <input type="submit" name="提交">
    </form>
    </body>
    </html>
    

      

     六、路由中间件 koa-router

    npm install koa-router --save
    

    路由是可以设置多级的,可以嵌套。方便我们自由拆分。

    const koa = require('koa');
    const router = require('koa-router');
    let app = new koa();
    app.listen(8888);
    
    let users = new router();
    let order = new router();
    
    users.get('/', function (ctx) {
        ctx.body = '用户页面';
    });
    
    users.get('/add', function (ctx) {
        ctx.body = '用户添加页面';
    });
    
    order.get('/', function (ctx) {
        ctx.body = '订单页面';
    });
    
    order.get('/add', function (ctx) {
        ctx.body = '订单添加页面';
    });
    
    let route = new router();
    route.use('/users', users.routes());
    route.use('/order', order.routes());
    app.use(route.routes());
    

      

    七、cookie的设置与读取

    koa中可以直接通过 ctx.cookies.set() 或 ctx.cookies.get() 进行设置和获取cookie

    const koa = require('koa');
    const router = require('koa-router');
    let app = new koa();
    app.listen(8888);
    
    //设置cookie签名加密时,需要配置密钥
    app.keys = [
        '2dsfjo3rt3pt934rjh2'
    ];
    
    let route = new router();
    
    route.get('/', function (ctx, next) {
    
        //参数一表示,cookie名称
        //参数二表示,cookie的值
        //参数三表示,cookie的配置选项
        ctx.cookies.set('test', 'test', {
            //cookie所在的域名
            domain: 'localhost',
            //cookie所在的路径
            path: '/',
            //有效时间,单位毫秒
            maxAge: 3600 * 1000,
            //失效时间
            expires: new Date(Date.now() + 3600 * 1000),
            //是否只能在http中获取
            httpOnly: true,
            //是否允许重写
            overwrite: true
        });
    
        //设置cookie是否签名加密,如果设置签名加密,需配置app.keys
        ctx.cookies.set('name', 'xiaoxu', {signed: true});
    
        //获取cookie
        console.log(ctx.cookies.get('test'));
        console.log(ctx.cookies.get('name'));
    });
    
    app.use(route.routes());
    

      

    八、session的使用

    安装 koa-session 中间件

    npm install koa-session --save
    

    koa-session默认会话是基于cookie实现的,当然会话信息也可以保存到其它地方。

    const koa = require('koa');
    const router = require('koa-router');
    const session = require('koa-session');
    let app = new koa();
    app.listen(8888);
    
    //设置签名加密的密钥
    app.keys = [
        'rj345jptjgadsfjeasltrg'
    ];
    
    let route = new router();
    
    //使用koa-session中间件
    app.use(session({
        //cookie的名称
        key: 'session',
        //有效时间
        maxAge: 3600 * 1000,
        //是否自动提交头信息
        autoCommit: true,
        //是否充许重写
        overwrite: true,
        //是否只能http获取
        httpOnly: true,
        //是否签名加密
        signed: true
    }, app));
    
    route.get('/', function (ctx, next) {
        if (ctx.session.count) {
            ++ctx.session.count;
        } else {
            ctx.session.count = 1;
        }
        ctx.body = `您是第 ${ctx.session.count} 次访问`;
    });
    
    app.use(route.routes());
    

      

    九、模板引擎ejs的使用

    npm install koa-ejs --save
    

    通过ejs模板引擎,我们可以很方便的渲染页面。

    const path = require('path');
    const koa = require('koa');
    const router = require('koa-router');
    const ejs = require('koa-ejs');
    let app = new koa();
    app.listen(8888);
    
    let route = new router();
    
    //模板引擎配置
    ejs(app, {
        //模板目录
        root: path.join(__dirname, 'views'),
        //布局文件
        layout: false,
        //模板扩展名
        viewExt: 'html',
        //是否开启缓存
        cache: false,
        //是否开启调试信息
        debug: true
    });
    
    route.get('/', async function (ctx, next) {
        await ctx.render('index', {
            name: 'xiaoxu',
            age: 24
        });
    });
    
    app.use(route.routes());
    

      

    十、静态资源中间件

    我们使用 koa-static-cache 这个中间件。

    npm install koa-static-cache --save
    

    使用 koa-static-cache 帮我们处理静态资源

    const path = require('path');
    const koa = require('koa');
    const static = require('koa-static-cache');
    let app = new koa();
    app.listen(8888);
    
    //使用中间件,并配置静态资源目录
    app.use(static(path.join(__dirname, 'public'), {
        //是否压缩文件
        gzip: true,
        //缓存有效时间
        maxAge: 60
    }));
    

      

  • 相关阅读:
    [NoiPlus2016]换教室
    [HNOI2013]游走
    [Noi2002]Savage
    [SDOI2010]古代猪文
    [JSOI2008]最小生成树计数
    [SCOI2010] 连续攻击游戏
    文艺平衡树
    指针FHQTreap
    HAOI2007 上升序列
    HNOI2008 玩具装箱
  • 原文地址:https://www.cnblogs.com/jkko123/p/10296491.html
Copyright © 2020-2023  润新知