美文网首页
使用Koa提供API服务

使用Koa提供API服务

作者: Yes_no | 来源:发表于2020-04-27 13:00 被阅读0次

    使用koa提供API服务

    官方文档:https://koa.bootcss.com/

    安装koa依赖

    npm install --save koa
    

    创建 index.js 文件并运行

    const Koa = require('koa') //引入koa
    
    const app = new Koa() //创建一个koa实例
    
    // 每一个http请求,koa将调用我们传入的异步函数来处理
    app.use(async(ctx) => { ctx.body = 'Hello Koa' })
    
    app.listen(3000) //监听3000端口
    
    console.log('app is starting at 127.0.0.1:3000') //启动提示信息
    

    ctx变量

    ctx是由koa传入的封装了request和response的变量,我们可以通过它访问request和response

    async (ctx, next) => {
        await next();  // 调用下一个middleware
        // 设置response的Content-Type:
        ctx.response.type = 'text/html';
        // 设置response的内容:
        ctx.response.body = '<h1>Hello, koa2!</h1>';
    }
    

    为什么要调用await next()

    koa把很多async函数组成一个处理链,每个async函数都可以做一些自己的事情,然后用await next()来调用下一个async函数。我们把每个async函数称为middleware,这些middleware可以组合起来,完成很多有用的功能。

    app.use(async (ctx, next) => {
        console.log(`${ctx.request.method} ${ctx.request.url}`); // 打印URL
        await next(); // 调用下一个middleware
    });
    
    app.use(async (ctx, next) => {
        const start = new Date().getTime(); // 当前时间
        await next(); // 调用下一个middleware
        const ms = new Date().getTime() - start; // 耗费时间
        console.log(`Time: ${ms}ms`); // 打印耗费时间
    });
    
    app.use(async (ctx, next) => {
        await next();
        ctx.response.type = 'text/html';
        ctx.response.body = '<h1>Hello, koa2!</h1>';
    });
    

    GET请求处理

    app.use(async ctx => {
        //从request中接收Get请求
        let url =  ctx.url;
        let request = ctx.request;
        let req_query = request.query //处理过
        let req_queryString = request.querystring //未处理
    
        //从上下文还中直接获取Get请求
        let ctx_query = ctx.query
        let ctx_queryString = ctx.querystring
        ctx.body = {
            url,
            ctx_query,
            ctx_queryString
        }
    })
    
    get请求示例

    POST请求处理

    1.解析上下文ctx中的原生node.js对象req。
    2.将POST表单数据解析成query string-字符串
    (例如:user=jspang&age=18)
    3.将字符串转换成JSON格式。

    ctx.request 和 ctx.req的区别

    ctx.request:是Koa2中context经过封装的请求对象,它用起来更直观和简单。
    ctx.req:是context提供的node.js原生HTTP请求对象。这个虽然不那么直观,但是可以得到更多的内容,适合我们深度编程。

    const Koa = require('koa')
    const app = new Koa()
    
    app.use(async(ctx)=> {
        if (ctx.url === '/' && ctx.method === 'GET') {
            // 显示表单页面
            let html = `
                <h1>Koa2 request POST</h1>
                <form method="POST" action="/">
                <p>userName</p>
                <input name="userName" /><br/>
                <p>age</p>
                <input name="age" /><br/>
                <p>website</p>
                <input name="webSite" /><br/>
                <button type="submit">submit</button>
            `
            ctx.body = html
        } else if (ctx.url === '/' && ctx.method === 'POST') {
            let postData = await parsePostData(ctx) 
            ctx.body = parseQueryStr(postData) //Json格式的参数
        } else {
            ctx.body = '<h1>404!</h1>'
        }
    })
    
    //定义一个获取post请求参数的方法
    function parsePostData(ctx){
        return new Promise((resolve,reject)=>{
            try{
                //定义一个接收参数的变量
                let postdata = ""
                //监听data,并将接收到的data拼接入postdata变量
                ctx.req.addListener('data',(data)=>{
                    postdata += data
                })
                //监听end,结束时返回拼接了参数的变量
                ctx.req.on('end',()=>{
                    resolve(postdata)
                })
            }catch(error){ //报错时返回错误信息
                reject(error)
            }
        })
    }
    // JSON格式转换
    function parseQueryStr(queryStr){
        let queryData = {} //存放json格式的对象
        let queryStrList = queryStr.split('&') //将字符串按 & 拆分成数组
        for(let [index,queryStr] of queryStrList.entries()){ // for(queryStr of queryStrList) 亦可
            let itemList = queryStr.split('=') //将字符串按 = 拆分成数组
            queryData[itemList[0]] = decodeURIComponent(itemList[1]) //键值的方式添加到定义的对象
        }
        return queryData
    }
    
    app.listen(3000,()=>{
        console.log('127.0.0.1:3000')
    })
    

    相关文章

      网友评论

          本文标题:使用Koa提供API服务

          本文链接:https://www.haomeiwen.com/subject/faqevhtx.html