使用Koa提供API服务

2020-04-27  本文已影响0人  Yes_no

使用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')
})
上一篇下一篇

猜你喜欢

热点阅读