koa2的安装和使用 定义和注册路由 并模拟登录校验

124 阅读2分钟

先说一下koa的基本使用

初始化 npm init -y

安装 npm install koa

const Koa = require("koa");
const app = new Koa();
// ctx ==> context
app.use(async (ctx) => {
	ctx.body = "hello world";
});

app.listen(3000);

?在浏览器中打开http://localhost:3000可以看到如下效果

image.png

使用脚手架 koa-generator 创建 koa2 项目

windows+r, cmd 打开命令行 使用如下命令全局安装 koa-generator npm i -g koa-generator

我们新建一个测试文件夹, 在里面执行如下命令 koa2 koa2-demo

打开文件夹koa2-demo 安装需要的包 npm i

执行npm run dev

项目开始

在router下面新建路由,原来router下面已经有unser.jsindex.js 这里继续新建comment.js 然后模仿user.js的内容创建路由

各行代码的含义如下 ctx是req和res的结合,ctx.query可以获取到原来请求体里面携带的所有数据,是一个对象,可以定义一个对象来接收。

ctx.request.body可以获取请求体里面的内容

首先router/comment.js中定义路由

const router = require('koa-router')()
// 前缀,所有的接口后面先写上这个前缀
router.prefix('/comment')
// get 请求,第一个参数是路径,第二个参数是箭头函数
// ctx是req,res的集合 ctx能返回响应的内容
// ctx里面有请求携带的参数,可以直接打点调用
router.get('/list', function (ctx, next) {
    const queryObj = ctx.query
    // 返回响应内容
  ctx.body = {
errno:0,
data:[
    {id:1,userName:"张三",content:"张三真帅!!!!"},
    {id:2,userName:"李四",content:"李四真帅!!!!"},
    {id:3,userName:"王五",content:"王五真帅!!!!"},
   
]


  }
})
// post 请求
router.post('/create', function (ctx, next) {
    // 获取请求体,
    const body= ctx.request.body;
    console.log(body);
  ctx.body = "这是创建留言列表接口,留言的内容是:" + body.userName + body.userPassword + body.date
})
// 输出
module.exports = router

##在app.js中注册路由,原来的app.js中已经包括了很多内容,在原先的基础上增加

const Koa = require("koa");
const app = new Koa();
const views = require("koa-views");
const json = require("koa-json");
const onerror = require("koa-onerror");
const bodyparser = require("koa-bodyparser");
const logger = require("koa-logger");

const index = require("./routes/index");
const users = require("./routes/users");
const comment = require("./routes/comment");

// error handler
onerror(app);

// middlewares
app.use(
  bodyparser({
    enableTypes: ["json", "form", "text"],
  })
);
app.use(json());
app.use(logger());
app.use(require("koa-static")(__dirname + "/public"));

app.use(
  views(__dirname + "/views", {
    extension: "pug",
  })
);

// logger
app.use(async (ctx, next) => {
  const start = new Date();
  await next();
  const ms = new Date() - start;
  console.log(`${ctx.method} ${ctx.url} - ${ms}ms`);
});
// 模拟登录校验
app.use(async (ctx, next) => {
  // ctx.query可以获取到请求体里面携带的所有内容
  // 已经转成了对象,可以直接定义一个对象来接收
  // 然后打点调用
  const queryObj = ctx.query;
  if (queryObj.userName === "张三") {
    // 登录成功,执行下一步
    await next();
  }else{
    ctx.body="请登录"
  }
});

// routes
app.use(index.routes(), index.allowedMethods());
app.use(users.routes(), users.allowedMethods());
app.use(comment.routes(), comment.allowedMethods());

// error-handling
app.on("error", (err, ctx) => {
  console.error("server error", err, ctx);
});

module.exports = app;



把路由复制到postman中测试,注意url的路径,分别使用POST 和 GET方法,效果如下:

image.png

image.png