Nodejs-Koa框架

1. 认识Koa

nodejs中除了express框架, 另外一个非常流行的Node Web服务器框架就是Koa。

事实上,koa是express同一个团队开发的一个新的Web框架:

  • 目前团队的核心开发者TJ的主要精力也在维护Koa,express已经交给团队维护了;
  • Koa旨在为Web应用程序和API提供更小、更丰富和更强大的能力;
  • 相对于express具有更强的异步处理能力(后续我们再对比);
  • Koa的核心代码只有1600+行,是一个更加轻量级的框架,我们可以根据需要安装和使用中间件;

2. Koa初体验

koa注册的中间件提供了两个参数:

  • ctx:上下文(Context)对象:
    • koa并没有像express一样,将req和res分开,而是将它们作为 ctx的属性;
    • ctx代表依次请求的上下文对象;
    • ctx.request:获取请求对象;
    • ctx.response:获取响应对象;
  • next:本质上是一个dispatch,类似于之前的next;

3. Koa中间件

koa通过创建的app对象,注册中间件只能通过use方法:

  • Koa并没有提供methods的方式来注册中间件;
  • 也没有提供path中间件来匹配路径;

真实开发中我们如何将路径和method分离呢?

  • 方式一:根据request自己来判断;
  • 方式二:使用第三方路由中间件;
const Koa = require('koa');

const app = new Koa();

app.use((ctx, next) => {
  if(ctx.request.url === '/login') {
    if(ctx.request.method === 'GET') {
      ctx.response.body = "Login Success~";
    }
  } else {
    ctx.response.body = "other request~"
  }
})

app.listen(8000, () => {
  console.log('koa服务器启动成功')
})

4. 路由的使用

koa官方并没有给我们提供路由的库,我们可以选择第三方 库:koa-router

npm install koa-router

  • 可以先封装一个 user.router.js 的文件:
  • 在app中将router.routes()注册为中间件:
  • 注意:allowedMethods用于判断某一个method是否支持:
    • 如果我们请求 get,那么是正常的请求,因为我们有实 现get;
    • 如果我们请求 put、delete、patch,那么就自动报错: Method Not Allowed,状态码:405;
    • 如果我们请求 link、copy、lock,那么久自动报错: Not Implemented,状态码:501;
const Koa = require('koa');

const userRouter = require('./router/user');

const app = new Koa();

app.use((ctx, next) => {
  // ctx.response.body = "hello world";
  next()
})

app.use(userRouter.routes());
// 对没有写的请求方法进行拦截
app.use(userRouter.allowedMethods())

app.listen(8000, () => {
  console.log('koa路由服务器启动成功')
})

5. 参数解析:params - query

请求地址:http://localhost:8000/users/123

  • 获取params:
userRouter.get('/:id', (ctx, next) => {
  console.log(ctx.request.params.id)
  ctx.response.body = "request success"
})

请求地址:http://localhost:8000/login?username=why&password=123

  • 获取query:
app.use((ctx, next) => {
  console.log(ctx.request.query)
  ctx.response.body = "Hellp World"
})

6. 参数解析:json

请求地址:http://localhost:8000/login

  • body是json格式:

{

        "username": "coderhgf",

        "password": "123456"

}

  • 获取json数据:

安装依赖: npm install koa-bodyparser;

使用 koa-bodyparser的中间件;

const Koa = require('koa');
const bodyParser = require('koa-bodyparser')
const multer = require('koa-multer');

const app = new Koa();

const upload = multer()

app.use(bodyParser());
// 解析任意的form-data传递的数据
app.use(upload.any())

app.use((ctx, next) => {
  console.log(ctx.request.body)
  console.log(ctx.req.body)
  ctx.response.body = "Hello World~"
})

app.listen(8000, () => {
  console.log('koa路由服务器启动成功')
})

7. Multer上传文件

const Koa = require('koa');
const Router = require('koa-router');
const multer = require('koa-multer');

const app = new Koa();

const uploadRouter = new Router({prefix: '/upload'})

const upload = multer({
  dest: './uploads/'
});

uploadRouter.post('/avatar', upload.single('avatar'), (ctx, next) => {
  console.log(ctx.req.file)
  ctx.response.body = "上传头像成功";
});

app.use(uploadRouter.routes());

app.listen(8000, () => {
  console.log('koa服务器启动成功')
});

8. 数据的响应

输出结果:body将响应主体设置为以下之一:

  • string :字符串数据
  • Buffer :Buffer数据
  • Stream :流数据
  • Object|| Array:对象或者数组
  • null :不输出任何内容
  • 如果response.status尚未设置,Koa会自动将状态设置为200或204。
const Koa = require('koa');

const app = new Koa();

app.use((ctx, next) => {
  ctx.status = 200
  ctx.response.body = {
    name: "coderhgf",
    age: 20
  }
})

app.listen(8000, () => {
  console.log('koa服务器启动成功')
})

9. 静态服务器

koa并没有内置部署相关的功能,所以我们需要使用第三方库:

npm install koa-static

部署的过程类似于express:

10. 错误处理

const Koa = require('koa');

const app = new Koa();

app.use((ctx, next) => {
  const isLogin = false;
  if(!isLogin) {
    ctx.app.emit('error', new Error("您还没有登录~"), ctx);
  }
})

app.on('error', (err, ctx) => {
  ctx.status = 401
  ctx.body = err.message
})

app.listen(8000, () => {
  console.log('koa服务器启动成功')
})
  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Node.js 中使用 Koa 框架进行事务管理可以使用以下两种方式: 1. 使用数据库事务:如果你使用的是支持事务的数据库(如 MySQL、PostgreSQL 等),那么你可以使用数据库提供的事务功能来管理事务。在 Koa 中,你可以使用像 Sequelize 这样的 ORM 库来管理数据库操作。 例如,在 Sequelize 中使用事务的代码示例: ``` // 创建一个事务 const transaction = await sequelize.transaction(); try { // 在事务中执行数据库操作 await User.create({ name: 'John Doe' }, { transaction }); await Profile.create({ userId: 1, bio: 'Hello, world' }, { transaction }); // 提交事务 await transaction.commit(); } catch (error) { // 回滚事务 await transaction.rollback(); } ``` 在上面的示例中,我们使用了 `sequelize.transaction()` 方法来创建一个事务,并将其传递给每个数据库操作。如果其中任何一个操作失败,那么事务将会回滚,所有操作都将被撤销。 2. 使用 Koa 中间件:另一种管理事务的方法是使用 Koa 中间件来实现。你可以编写一个中间件函数,将所有需要在事务中执行的操作包裹起来,并在出现错误时回滚事务。 例如,在 Koa 中使用中间件管理事务的代码示例: ``` app.use(async (ctx, next) => { const transaction = await sequelize.transaction(); try { // 将事务对象绑定到上下文对象中 ctx.transaction = transaction; // 执行下一个中间件 await next(); // 提交事务 await transaction.commit(); } catch (error) { // 回滚事务 await transaction.rollback(); // 抛出错误 throw error; } }); // 在路由中使用事务 router.post('/users', async (ctx) => { // 从上下文对象中获取事务对象 const transaction = ctx.transaction; try { // 在事务中执行数据库操作 await User.create({ name: 'John Doe' }, { transaction }); await Profile.create({ userId: 1, bio: 'Hello, world' }, { transaction }); // 发送响应 ctx.body = { success: true }; } catch (error) { // 如果发生错误,将会自动回滚事务 throw error; } }); ``` 在上面的示例中,我们编写了一个 Koa 中间件函数,该函数会在每个请求中创建一个事务,并将其绑定到上下文对象中。在路由处理函数中,我们可以从上下文对象中获取事务对象,并使用它来执行数据库操作。如果任何一个操作失败,中间件将会回滚事务,并将错误抛出到全局错误处理函数中。 总的来说,使用数据库事务或 Koa 中间件来管理事务都是有效的方式。选择哪种方式取决于你的具体需求和项目的架构。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值