精华内容
下载资源
问答
  • Koa v2

    2020-12-30 10:51:21
    ve tried getting the current koa-hbs working with Koa v2 using <a href="https://www.npmjs.com/package/koa-adapter">koa-adapter, but haven't succeeded).</p><p>该提问来源于开源项目:koajs/koa-...
  • Koa 2

    2020-12-30 12:06:30
    <div><p>Any plans to update for koa2 ?</p><p>该提问来源于开源项目:koajs/generic-session</p></div>
  • koa2

    2021-04-06 12:14:18
    1. koa2安装 全局安装koa命令:cnpm i koa-generator -g 生成项目:Koa2 项目名 安装依赖:cd 项目名 ​ cnpm install 安装nodemon跟cross-env(对不同环境进行监听,热监听):cnpm i nodemon cross-env --...

    1. koa2安装

    1. 全局安装koa命令:cnpm i koa-generator -g

    2. 生成项目:Koa2 项目名

    3. 安装依赖:cd 项目名

      cnpm install

    4. 安装nodemon跟cross-env(对不同环境进行监听,热监听):cnpm i nodemon cross-env --save-dev

    5. 修改package.json中的配置:

      "scripts": {
          "start": "node ./bin/www",
          "dev": "cross-env NODE_ENV=dev nodemon --inspect=9829 ./bin/www.js",
          "prod": "cross-env NODE_ENV=prod nodemon ./bin/www.js"
      }
      
    6. 重写启动项目:npm run dev

    2. koa2几个知识点

    1. ctx相当于req跟res的结合

    2. 如何返回数据到客户端:ctx.body (注express使用:req.json({}))

      router.get('/string', async (ctx, next) => {
        ctx.body = 'koa2 string'
      })
      
    3. 如何获取客户端传来的json数据:ctx.request.body

      如何获取get请求参数:ctx.query

      如何获取session:ctx.session

    4. 如何添加根路由

      const router = require('koa-router')()
      //根路由
      router.prefix('/users')
      //要访问/bar,它的路径是:/users/bar
      router.get('/bar', function (ctx, next) {
        ctx.body = 'this is a users/bar response'
      })
      
    5. 自定义中间件next前面为啥要加await:中间件函数被async修饰,返回promise对象,由express中next作用可知道next是调用下一个中间件,因此在其前面加上await将异步操作变成同步的写法。

      app.use(async (ctx, next) => {
        const start = new Date()
        await next() 
        const ms = new Date() - start
        console.log(`${ctx.method} ${ctx.url} - ${ms}ms`)
      })   
      

    3. 登陆:koa-generic-session 跟 koa-redis实现将登陆信息存放到session、redis中

    1. 安装:

      cnpm i koa-generic-session koa-redis redis --save
      
    2. App.js中配置:koa-generic-session、koa-redis设置返回客户端cookie

      const session = require("koa-generic-session");
      const RedisStore = require("koa-redis");
      
      //session配置
      app.keys = ["jiangyf0725"];
      app.use(session({
        cookie: {
          path: '/',
          httpOnly: true,
          maxAge: 24 * 60 * 60 *1000
        },
        //redis跟session进行绑定
        store: RedisStore({
          all: "redis端口号"
        }) 
      }))
      

    4. 日志记录

    1. 安装:koa-morgan记录日志

      cnpm i koa-morgan --save
      
    2. 生成环境:将日志写到指定文件中

      开发环境:将日志写在控制

      const path = require("path");
      const fs = require("fs");
      const morgan = require("koa-morgan");
      
      const env = process.env.NODE_ENV;
      if(env == 'dev') {
        //开发环境
        app.use(morgan('dev'));
      }else {
        //生产环境写日志文件路径
        const aceessPathName = path.join(__dirname, "log", "access.log");
        const writeStream = fs.createWriteStream(aceessPathName, {
          flag: "a"
        })
        app.use(
            morgan('combined', {stream: writeStream})
        );
      }
      

    5. 中间件实现原理

    展开全文
  • Koa2

    2020-03-12 17:09:36
    安装koa2 Koa 依赖 node v7.6.0 或 ES2015及更高版本和 async 方法支持. cnpm i koa --save 二. hello world const Koa = require('koa')//引入Koa const app = new Koa(); //实例化Koa app.use(...

    koa2官网: https://koa.bootcss.com/

    一. 安装koa2

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

    cnpm i koa --save

    二. hello world

    const Koa = require('koa')//引入Koa
    
    const app = new Koa();   //实例化Koa
    
    app.use(async (ctx) => {    //使用app
        ctx.body = 'hola'       //ctx就是context上下文,是Koa自带的对象
    })
    app.listen(3000);
    context是什么?

    我们先查看下ctx对象

    Koa Context将节点的请求和响应对象封装到单个对象中,该对象为编写Web应用程序和API提供了许多有用的方法。
    简单来说:

    • ctx.url 是Koa请求的路径
    • ctx.request是Koa请求对象;
    • ctx.response 是Koa响应对象
    • ctx.body body是http协议中的响应体 ctx.body = ctx.res.body = ctx.response.body
    • ctx.req 是原生nodejs.request请求对象
    • ctx.res 是原生nodejs.response响应对象
    • ctx.method 是Koa的请求方法
      想了解上下文context,请看文章:https://www.jianshu.com/p/9488cd3feaf9

    三. 接收get请求接收

    Koa接收的get请求会存入上下文中,我们只需要从上下文中通过ctx.request取出即可

    const Koa = require("koa")
    
    const app = new Koa();
    app.use(
        async (ctx) => {
            let url = ctx.url;
            let request = ctx.request;
            let req_query = req.query;
            let req_querystring = req.querystring;
    
            ctx.body = {
                url,
                req_query,
                req_querystring
            }
        }
    )
    app.listen(
        3000, () => {
            console.log('running');
        }
    )

    其中ctx.request.query是请求中的query对象,


    其中ctx.request.querystring是请求中的query字符串,

    除了使用ctx.request.queryctx.request.querystring之外,问了方便使用,koa还允许用ctx.query ctx.querystring这样的简写

    四. Post请求接收

    对于POST请求的处理,Koa2没有封装方便的获取参数的方法,需要通过解析上下文context中的原生node.js请求对象req来获取。

    1. 原生方法获取Post请求的步骤:(仅为了学习原理)

    • 解析上下文ctx中的原生nodex.js对象req。
    • 将POST表单数据解析成query string-字符串.(例如:user=jspang&age=18)
    • 将字符串转换成JSON格式。
    const Koa = require("koa")
    
    const app = new Koa();
    app.use(
        async (ctx) => {
            if (ctx.url === '/' && ctx.method === "GET") {
                ctx.body = `    <h1>haha</h1>
                <form action="/" method="post">
                    <input type="text" name="name">
                    <input type="number" name="age">
                    <button type="submit">OK</button>
                </form>`
            } else if (ctx.url === '/' && ctx.method === "POST") {
                let postdata = await parsePost(ctx)  //注意是异步调用
                ctx.body = postdata
            } else {
                ctx.body = '404'
            }
        }
    )
    function parsePost(ctx) { //解析ctx里的post
        return new Promise((resolve, reject) => {
            try {
                let postdata = '';
                ctx.req.addListener('data', (data) => {  //ctx.req添加监听事件监听data的变化
                    postdata = data.toString(); //接收新的data并转为字符串
                    parseQueryStr(postdata);//将字符串转为JSON对象
                })
                ctx.req.on('end', function () {  //ctx.req添加监听事件监听end
                    resolve(parseQueryStr(postdata))
                })
            } catch (error) {
                reject(error)
            }
        })
    }
    function parseQueryStr(queryStr) {//此函数用于将Post字符串转化为对象
        let queryData = {}
        let queryStrList = queryStr.split('&')
        for (let [index, queryStrInList] of queryStrList.entries()) {
            let itemList = queryStrInList.split('=')
            queryData[itemList[0]] = decodeURIComponent(itemList[1])
        }
        return queryData
    }
    app.listen(
        3000, () => {
            console.log('running');
        }
    )

    2. 使用中间件 koa-bodyparser

    (1).安装

    cnpm i koa-bodyparser --save

    (2). 使用

    //引入
    const bodyparser=require('koa-bodyparser')
    //使用
    app.use(bodyparser())

    经过上面的步骤后,当有post请求时,koa-bodyparser会自动将解析好的对象放入 ctx.request.body之中
    上面的程序可以改成:

    const Koa = require("koa")
    const bodyparser = require('koa-bodyparser')
    const app = new Koa();
    
    app.use(bodyparser())
    app.use(
        async (ctx) => {
            if (ctx.url === '/' && ctx.method === "GET") {
                ctx.body = `    <h1>haha</h1>
                <form action="/" method="post">
                    <input type="text" name="name">
                    <input type="number" name="age">
                    <button type="submit">OK</button>
                </form>`
            } else if (ctx.url === '/' && ctx.method === "POST") {
                let postdata = ctx.request.body  //注意是异步调用
                ctx.body = postdata
            } else {
                ctx.body = '404'
            }
        }
    )
    app.listen(
        3000, () => {
            console.log('running');
        }
    )

    五. 路由

    1. 原生路由 (仅为了学习原理)

    const Koa = require("koa")
    const fs = require('fs')
    const app = new Koa();
    app.use(
        async (ctx) => {
            let html = await myrouter(ctx.url);
            ctx.body = html
        }
    )
    async function myrouter(url) {
        let page = '404.html'
        switch (url) {
            case '/':
                page = 'index.html'
                break;
            case '/index':
                page = 'index.html'
                break;
            case '/todo':
                page = 'todo.html'
                break;
            default:
                break;
        }
        let html = await myrender(page);
        return html
    }
    async function myrender(page) {
        return new Promise((resolve, reject) => {
            fs.readFile(`./page/${page}`, 'binary', (err, data) => {
                if (err) reject(err);
                resolve(data);
            })
        })
    }
    app.listen(
        3000, () => {
            console.log('running');
        }
    )

    2. 使用中间件 koa-router

    cnpm install koa-router --save

    (1). 基本使用方法

    //1. 引入
    const Router = require('koa-router')
    
    //2. 实例化
    const router = new Router();
    
    //3. 写请求处理
    router.get('/', (ctx, next) => {
        ctx.body='hola'
    })
    
    //4. app用起来
    app.use(router.routes())

    例:

    const Koa = require("koa")
    const fs = require('fs')
    const Router = require('koa-router')
    
    const app = new Koa();
    const router = new Router();
    
    router
        .get('/', (ctx, next) => {
            ctx.body = 'hola'
        })
        .get('/todo', (ctx, next) => {
            ctx.body = 'todos'
        })
    
    app
        .use(router.routes())
        .use(router.allowedMethods())
    
    app.listen(
        3000, () => {
            console.log('running');
        }
    )

    我们把原生的例子改为用koa-router

    const Koa = require("koa")
    const fs = require('fs')
    const Router = require('koa-router')
    
    const app = new Koa();
    const router = new Router();
    
    router
        .get('/', async (ctx, next) => {
            ctx.body = await getPage('index')
        })
        .get(['/todo', '/index'], async (ctx, next) => {
            ctx.body = await getPage(ctx.url)
        })
        .get('*', async (ctx, next) => {
            ctx.body = await getPage(404)
        })
    async function getPage(url) {
        return new Promise((resolve, reject) => {
            fs.readFile(`./page/${url}.html`, 'binary', (err, data) => {
                if (err) reject(err)
                console.log(data);
                resolve(data)
            })
        })
    }
    app
        .use(router.routes())
        .use(router.allowedMethods())
    
    app.listen(
        3000, () => {
            console.log('running');
        }
    )

    (2). 路由的层级

    ①. 前缀

    给路由直接增加一个层级

    const router = new Router({
        prefix:'/hola'
    });

    这样一来, 原先 /xxx访问的页面 要/hola/xxx 来访问了~~

    ③. 主路由子路由分离
    • 分别实例化父路由及子路由
    • 配置子路由
    • 父路由挂载子路由
    const Koa = require("koa")
    const Router = require('koa-router')
    
    const app = new Koa();
    const router = new Router(); //父路由
    const home = new Router();   //子路由
    const page = new Router();   //子路由
    
    home
        .get('/', async (ctx, next) => {
            ctx.body = '/home/index'
        })
        .get('/todo', async (ctx, next) => {
            ctx.body = '/home/todo'
        })
    page
        .get('/', async (ctx, next) => {
            ctx.body = '/page/index'
        })
        .get('/todo', async (ctx, next) => {
            ctx.body = '/page/todo'
        })
    
    router.use('/home', home.routes(), home.allowedMethods())
    router.use('/page', page.routes(), page.allowedMethods())
    
    app
        .use(router.routes())
        .use(router.allowedMethods())
    app.listen(
        3000, () => {
            console.log('running');
        }
    )

    六. cookie

    cookie也被封装进了ctx
    cookie的读: ctx.cookies.get('键')
    cookie的写: ctx.cookies.set('键','值',{配置})

    const Koa = require("koa")
    
    const app = new Koa();
    
    app.use(
        async (ctx) => {
            if (ctx.url === '/index') {
                ctx.cookies.set(
                    'MyName', 'lili', {   //cookie的键值
                    domain: ['127.0.0.1'],  //cookie的域名信息
                    maxAge: 1000 * 60 * 60 * 24 * 10, //最大有效事件 单位毫秒
                    expires: new Date('2020-05-01'),  //失效时间
                    httpOnly: false,  //只允许http请求时才有效,一般填false
                    overwrite: false   //允许重写?  一般填false
                }
                )
                ctx.body = 'Cookie is Ok'
            } else {
                if (ctx.cookies.get('MyName')) {
                    ctx.body = ctx.cookies.get('MyName')
                } else {
                    ctx.body = 'cookie is not ready'
                }
            }
        }
    )
    app.listen(
        3000, () => {
            console.log('running');
        }
    )

    七. 模板引擎 koa-views ejs

    cnpm i koa-views --save
    cnpm i ejs --save
    const Koa = require("koa")
    const views = require('koa-views')
    const path = require('path')
    
    const app = new Koa();
    
    app.use(views(path.join(__dirname, './view'), {
        extension: 'ejs'
    }))
    
    app.use(
        async (ctx) => {
            await ctx.render('index', {
                title: 'hola~你好啊!'
            })
        }
    )
    app.listen(
        3000, () => {
            console.log('running');
        }
    )

    八. 引用静态资源

    cnpm i koa-static --save
    • 引入中间件
    • 设置好公开的静态资源目录
    • app用起来
    const Koa = require("koa")
    const path = require('path')
    const static = require('koa-static') //引入静态资源中间件
    
    const app = new Koa();
    
    const staticPath = './static' //要开放的静态资源文件夹
    
    app.use(static(path.join(__dirname, staticPath)))
    app.use(
        async (ctx) => {
            ctx.body = 'hello world'
        }
    )
    app.listen(
        3000, () => {
            console.log('running');
        }
    )
    展开全文
  • koa2-note:使用koa2的简单说明
  • 整体安装koa2-easy,之后使用koa2命令即可在当前目录一键生成服务端程序。地址为:当前目录/ koa2-easy npm i koa2-easy -g koa2 cd koa2-easy && npm i (推荐使用cnpm) 功能 渲染模板( ) 发送静态文件,如HTML...
  • [Koa2]Koa2中间件

    2020-08-27 13:48:48
    Koa2中间件 零、Koa-generator的安装和项目初始化 https://blog.csdn.net/qq_43540219/article/details/108244276 一、Koa2中间件 打开app.js: 如下图所示,红框中的都是Koa2自带的中间件 中间件的引用: 二、...

    Koa2中间件

    在这里插入图片描述

    零、Koa-generator的安装和项目初始化

    https://blog.csdn.net/qq_43540219/article/details/108244276

    一、Koa2中间件

    打开app.js:
    如下图所示,红框中的都是Koa2自带的中间件
    在这里插入图片描述
    中间件的引用:
    在这里插入图片描述

    二、自定义一个Koa2中间件

    新建一个目录/middleware
    在目录下创建一个文件koa-m1.js
    在这里插入图片描述
    编写中间件,在koa-m1.js

    /* 这个函数中写中间件的处理过程,
    *  具体要看中间件想要实现什么功能,
    *  我们这里用一个简单的打印请求路径代替 */
    
    function m1(ctx){
        // ctx一个是koa2中挂载所有request和response信息的全局对象
        global.console.log(ctx.path)// 输出当前请求的页面路径
    }
    
    /*导出中间件*/
    module.exports=function () {
        return async function(ctx,next){
            m1(ctx)
            await next() // 当前中间件已处理完毕,请交给下一个中间件处理
        }
    }
    
    

    导入中间件,在app.js
    在这里插入图片描述
    刷新页面后,打印了两个信息

    m1: /
    m1: /stylesheets/style.css
    

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    可以在F12 network中看到,对应有两个请求,’/'和‘/stylesheets/style.css’
    (如果看不到style.css,可能是浏览器缓存了,我们取消一下缓存再刷新即可,方法如下图)
    在这里插入图片描述
    按照上述方法,我们再新建和引入两个中间件koa-m2koa-m3
    (新建步骤图示省略)
    在这里插入图片描述
    在这里插入图片描述

    刷新页面后
    在这里插入图片描述
    我们在m1 2 3中都如下加入输出mx start和mx end

    function m1(ctx){
        // ctx一个是koa2中挂载所有request和response信息的全局对象
        global.console.log('m1:',ctx.path)// 输出当前的页面路径
    }
    
    /*导出中间件*/
    module.exports=function () {
        return async function(ctx,next){
            global.console.log('m1 start')
            m1(ctx)
            await next() // 当前中间件已处理完毕,请交给下一个中间件处理
            global.console.log('m1 end')
        }
    }
    

    刷新页面后看输出结果:

    可以看到执行顺序是一个环状的(m123start m321end)
    在这里插入图片描述
    虽然m2的顺序在m1后,但最后还是要交给m1 end进行处理,比如你有一个变量中途要变,但是最终想保持进来的状态,就可以在m1 end的时候进行一个处理
    每一层中间件的进入是依赖next()进行的
    当我们把m3中的next注释掉
    在这里插入图片描述
    此时刷新页面,会发现
    页面中:报错404
    在这里插入图片描述
    bash中:没有请求提示
    在这里插入图片描述

    这是因为我们在执行m3后没有next传递到下一个中间件中,负责渲染的中间件是在m3后的views
    在这里插入图片描述
    我们没有传递到views,自然页面也就无法渲染,所以报错404 not found了
    所以我们在自定义中间件的时候一定要记得写next()传递请求

    展开全文
  • nodeclub-koa2 说明 nodeclub-koa2是基于的koa2实现,欢迎大家提Issue/PR 。 nodeclub是express框架的, nodeclub-koa2除了框架不一样之外,还有一些其他的修改: 替换由于框架差异的npm pkg ; 去除/替换一些比较老...
  • koa,koa2后台api框架,resultApi框架,koa好用框架....
  • Koa2和Vue生成器 适用于Koa2和Vue.js的Yeoman生成器-使您可以通过合理的默认设置和最佳实践快速设置项目。 用法 步骤1 。 确保在开发计算机上安装了 v6或更高版本以及 。 节点^6.0.0 npm ^5.0.0 第二步。 生成此...
  • koa2项目的示例,koa2 mongoose ejs单纯示例
  • Koa2入门REST API应用程序 技术: Koa v2 MySQL JSON模式 纱 ESLint 吊钩 入门 创建数据库: CREATE DATABASE `koa2-starter` CHARACTER SET utf8 COLLATE utf8_general_ci; 安装Sequelize CLI: $ npm i -g ...
  • 技术栈 koa 2 MySQL的2 续集
  • 2.打开命令行(wind+R),用npm install koa2-generator -g 全局安装 (可以用淘宝镜像安装,安装会比npm快,cnpm install koa2-generator -g。如果没有cnpm可以先运行npm install cnpm -g,很多情况都可以用cnpm...

    1.首先老规矩你的电脑先要有装node
    2.打开命令行(wind+R),用npm install koa2-generator -g 全局安装
    (可以用淘宝镜像安装,安装会比npm快,cnpm install koa2-generator -g。如果没有cnpm可以先运行npm install cnpm -g,很多情况都可以用cnpm安装,速度真的很快,如果cnpm安装失败,可以换回npm安装)
    3.创建项目 koa2 test-koa2,如图表示成功:
    在这里插入图片描述
    左侧会出现项目目录:在这里插入图片描述
    4.进入到项目目录中去(cd test-koa2),安装依赖 npm install(或者cnpm install),安装成功后如图多一个node_modules的文件夹:在这里插入图片描述
    5.如何启动,这时我们可以看package.json文件(如图可以看到运行node ./bin/www就可以启动):在这里插入图片描述
    6.因此在终端输入,可以看到右上角变成node证明正在运行:在这里插入图片描述
    7.在文件bin目录下有个www文件中可以看到,项目定义端口号为3000,
    在这里插入图片描述
    8.因此运行将http://localhost:3000/输入到浏览器中就可以访问到了,如图:在这里插入图片描述
    这里我们可以用cnpm i nodemon --save安装nodemon,当我们修改项目中的代码时可以不用重启项目,只需要保存一下就可以同步更新。

    安装完后用nodemon bin/www运行在这里插入图片描述
    我们修改路由index.js中的title,修改成如图,然后保存,会自动重启项目在这里插入图片描述
    这时我们打开刚刚的网页刷新,就可以看到,在这里插入图片描述

    在这里插入图片描述

    最后,我个人理解上给说说生成的这个express项目目录中的文件功能,

    a.首先bin目录下有www是创建服务用的,是整个项目的启动文件

    b.node_modules目录是我们用npm install(或cnpm install)安装的依赖包,

    c.public目录是用来存放前端的图片,css文件,js文件等静态资源,

    d.routes目录是存放项目中的路由,

    e.views文件是存放前端页面视图,

    f.app.js中处理一些全局的东西,注册路由之类的, 服务文件,

    g.package.json中是项目中一些配置说明

    展开全文

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,577
精华内容 3,030
关键字:

koa2