在nodejs原始的http模块中,开启一个服务编码相对麻烦,需要对请求方式及上传的数据进行各种判断,而koa给我们提供了比较便捷的编码方式,同时它还有很多中间件可以直接拿来使用。
 
首先来看,如何开启一个服务,安装koa,引入Koa构造函数,通过new来创建koa的实例对象,监听8000端口,通过use来处理客户端的请求,use处理的中间件有两个参数,ctx表示上下文,request和response都在ctx中,next表示执行下一个匹配的中间件。以下代码表示当请求方式为get时,响应结果hello world
const Koa = require('koa')
const app = new Koa() app.use((ctx, next)=>{
if(ctx.request.method === 'GET'){
ctx.response.body = 'hello world'
}
}) app.listen(8000, ()=>{ console.log('8000端口启动') })
koa本身比较轻量,很多中间库都没有集成在koa内部,需要安装其他的库才能使用,首先常用的就是 koa-router,router 可以自定义路由,可通过get / post 等方法直接调用
const Koa = require('koa')
const app = new Koa()
const Router = require('koa-router')
const userRouter = new Router({ prefix: '/user' }) app.use((ctx, next) => {
next()
}) userRouter.post('/', (ctx, next)=>{
ctx.response.body = 'post请求'
}) app.use(userRouter.routes())
app.listen(8000, () => { console.log('8000端口启动') })
 
在get、post或者其他请求中,通常会携带一些参数,而参数对于我们接收请求返回响应也是非常重要的,get请求的参数通常有两种,分为query和params,query的方式是在url后面拼接问号和键值对的参数,类似于/user?name=kiki,params是在斜线后面添加参数,类似于 /user/1,这个数字1就是不固定的,可以由客户端传递的值,在koa-router中,都可以直接通过ctx.request对象中获取
const Koa = require('koa')
const app = new Koa()
const Router = require('koa-router')
const userRouter = new Router({ prefix: '/user' }) app.use((ctx, next) => {
next()
}) userRouter.get('/:id', (ctx, next)=>{
ctx.response.body = {
query: ctx.request.query,
params: ctx.request.params
}
}) app.use(userRouter.routes())
app.listen(8000, () => { console.log('8000端口启动') })
而post请求,常用的方式就是 json,urlencoded和表单上传的form-data,前两者可以通过 koa-bodyparser来处理,在request.body中获取解析后的json数据
const Koa = require('koa')
const app = new Koa()
const bodyParser = require('koa-bodyparser')
const Router = require('koa-router')
const userRouter = new Router({ prefix: '/user'}) app.use(bodyParser()) userRouter.post('/', (ctx, next)=>{
ctx.response.body = ctx.request.body
}) app.use(userRouter.routes())
app.listen(8000, ()=>{console.log('开启8000端口')})
而处理以form-data格式发送的请求时,需要通过 koa-multer,通过导入的multer函数来创建upload对象,upload.any() 可以用来接口非文件的数据,upload.single() 传入form-data中的key值来处理上传的文件
const Koa = require('koa')
const app = new Koa()
const Router = require('koa-router')
const userRouter = new Router({ prefix: '/user'})
const multer = require('koa-multer')
const upload = multer() userRouter.post('/', upload.single("file"), (ctx, next)=>{
ctx.response.body = {
body: ctx.req.body,
file: ctx.req.file
}
}) app.use(userRouter.routes())
app.listen(8000, ()=>{console.log('开启8000端口')})

 
在获取请求参数的过程中,可能存在参数不对需要进行报错提示,这种情况可以把报错进行统一的处理,通过ctx中app去发射一个错误信息,并通过 on函数进行捕获
const Koa = require('koa')
const app = new Koa() app.use((ctx, next)=>{
ctx.app.emit('error', new Error('请先登录'), ctx)
}) app.on('error', (err, ctx)=>{
ctx.body = err.message;
}) app.listen(8000, ()=> {})
koa与原生的nodejs相比,简化复杂的代码逻辑,让koa的编码更为简单,另一个框架express同样也可以简化编码,编码方式大同小异,可以看看这一篇,让nodejs开启服务更简单--express篇
 

让nodejs开启服务更简单--koa篇的更多相关文章

  1. hydra nodejs 微服务框架简单试用

    hydra 是一个以来redis 的nodejs 微服务框架 安装 需要redis,使用docker 进行运行 redis docker run -d -p 6379:6379 redis 安装yo ...

  2. [翻译]Kafka Streams简介: 让流处理变得更简单

    Introducing Kafka Streams: Stream Processing Made Simple 这是Jay Kreps在三月写的一篇文章,用来介绍Kafka Streams.当时Ka ...

  3. Kafka Streams简介: 让流处理变得更简单

    Introducing Kafka Streams: Stream Processing Made Simple 这是Jay Kreps在三月写的一篇文章,用来介绍Kafka Streams.当时Ka ...

  4. spring 第一篇(1-1):让java开发变得更简单(下)

    切面(aspects)应用 DI能够让你的软件组件间保持松耦合,而面向切面编程(AOP)能够让你捕获到在整个应用中可重用的组件功能.在软件系统中,AOP通常被定义为提升关注点分离的一个技术.系统由很多 ...

  5. spring 第一篇(1-1):让java开发变得更简单(下)转

    spring 第一篇(1-1):让java开发变得更简单(下) 这个波主虽然只发了几篇,但是写的很好 上面一篇文章写的很好,其中提及到了Spring的jdbcTemplate,templet方式我之前 ...

  6. 微服务平台(Micro Service Platform : MSP)旨在提供一个集开发、测试、运维于一体的开发者专属平台,让开发者能快速构建或使用微服务,让开发更简单,让运维更高效。

    微服务平台(Micro Service Platform : MSP)旨在提供一个集开发.测试.运维于一体的开发者专属平台,让开发者能快速构建或使用微服务,让开发更简单,让运维更高效. MSP采用业界 ...

  7. Anno 让微服务、混合编程更简单(Net love Java)

    在社区或者QQ群我们经常看到有人争辩编程语言的好坏,只要一提起这个话题常常就能引来很多人参与,往往最后就变成了一群人几个小时的骂战.今天我们要说的是如何让Java和.Net(甚至更多语言)相结合.充分 ...

  8. 让服务调用更简单 - Caller.HttpClient

    前言 绝大多数项目都离不开服务调用,服务的调用方式通常是基于Http.RPC协议的调用,需要获取到对应服务的域名或者ip地址以及详细的控制器方法后才能进行调用,如果项目需要支持分布式部署,则需要借助服 ...

  9. 分布式系统的消息&服务模式简单总结

    分布式系统的消息&服务模式简单总结 在一个分布式系统中,有各种消息的处理,有各种服务模式,有同步异步,有高并发问题甚至应对高并发问题的Actor编程模型,本文尝试对这些问题做一个简单思考和总结 ...

  10. vue—你必须知道的 js数据类型 前端学习 CSS 居中 事件委托和this 让js调试更简单—console AMD && CMD 模式识别课程笔记(一) web攻击 web安全之XSS JSONP && CORS css 定位 react小结

    vue—你必须知道的   目录 更多总结 猛戳这里 属性与方法 语法 计算属性 特殊属性 vue 样式绑定 vue事件处理器 表单控件绑定 父子组件通信 过渡效果 vue经验总结 javascript ...

随机推荐

  1. 【已解决】使用代理后,登陆微软账号提示0x800190001

    今天晚上想要登录Onedrive同步文件时,发现怎么都登陆不上去,报出的错误代码是0x80190001,在网上搜索了各种方法,重置网络,重置Onedrive都没什么用,甚至把Onedrive重装了一遍 ...

  2. python列表函数的基本使用

    一.列表简介 序列是Python最常见的操作,是最经常使用的一种数据操作.列表是当前序列中使用最多的. 序列中的每一个值对应的位置,称之为索引.通常情景下,第一个索引是位置为0,第二个索引位置为1.. ...

  3. 2023-04-17:设计一个包含一些单词的特殊词典,并能够通过前缀和后缀来检索单词。 实现 WordFilter 类: WordFilter(string[] words) 使用词典中的单词 wor

    2023-04-17:设计一个包含一些单词的特殊词典,并能够通过前缀和后缀来检索单词. 实现 WordFilter 类: WordFilter(string[] words) 使用词典中的单词 wor ...

  4. 2022-03-13:golang项目代码push到gogs上,如何自动编译、打镜像、k8s上运行?

    2022-03-13:golang项目代码push到gogs上,如何自动编译.打镜像.k8s上运行? 答案2022-03-13: 2022-02-23:如何搭建k8s单机环境(用k3s),并且搭建da ...

  5. Prompt learning 教学[技巧篇]:通过增加示例、引导词、特殊符号指令等方式让chatgpt输出更好的答案

    Prompt learning 教学[技巧篇]:通过增加示例.引导词.特殊符号指令等方式让chatgpt输出更好的答案 技巧1:To Do and Not To Do 在问答场景里,为了让 AI 回答 ...

  6. 【Linux】详解Centos7的下载安装配置

    本文时间 2023-05-17 作者:sugerqube漆瓷 为什么是Centos7 centos8已经停止维护,centos7将在2024-06-30停止维护(所以暂时选7) 未来替代品参考: Al ...

  7. 一篇文章告诉你什么是Java内存模型

    在上篇 并发编程Bug起源:可见性.有序性和原子性问题,介绍了操作系统为了提示运行速度,做了各种优化,同时也带来数据的并发问题, 定义 在单线程系统中,代码按照顺序从上往下顺序执行,执行不会出现问题. ...

  8. 向量数据库Pinecone,治疗ChatGPT幻觉的药方?

    大白话了解新鲜事,今天讲讲以Pinecone为代表的向量数据库.向量数据库Pinecone一夜爆火,4月27日B轮拿到了1亿美元的融资,估值达到7.5亿美元,一个2021年刚刚推出的数据库产品,火爆背 ...

  9. go for range的坑

    package main import "fmt" func main() { ParseStudent() } type student struct { Name string ...

  10. 代码随想录算法训练营Day28 回溯算法 | 491.递增子序列 46.全排列 47.全排列 II

    代码随想录算法训练营 491.递增子序列 题目链接:491.递增子序列 给定一个整型数组, 你的任务是找到所有该数组的递增子序列,递增子序列的长度至少是2. 示例: 输入: [4, 6, 7, 7] ...